2017-07-04 11 views
1

私は(C++ 17個の機能を使用して)次のことを達成しようとしています:グラムで私に次のエラーを与える非タイプの部分特殊化タプルが使用されないのはなぜですか?

#include <type_traits> 

template<auto value_> 
using constant_t = std::integral_constant<decltype(value_), value_>; 

template<typename ... > class Tuple {}; 

template<auto ... values_> 
class Tuple<constant_t<values_> ... > {}; 

int main(void) 
{ 
    Tuple<int, int, char> types; 
    Tuple<1, 2, 3> values; 
} 

++ - 7.1.0

main.cpp: In function ‘int main()’: 
main.cpp:15:18: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class Tuple’ 
    Tuple<1, 2, 3> values; 
      ^
main.cpp:15:18: note: expected a type, got ‘1’ 
main.cpp:15:18: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class Tuple’ 
main.cpp:15:18: note: expected a type, got ‘2’ 
main.cpp:15:18: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class Tuple’ 
main.cpp:15:18: note: expected a type, got ‘3’ 

、なぜ一部の誰もが説明できますTuple<1, 2, 3>の特化は有効になりませんか?

答えて

9

1と2と3はタイプではありません。特殊化では、プライマリテンプレートを値を受け入れるように変更することはできません(また、変更することもできません)。

あなたが値を受け入れるテンプレートをしたい場合は、エイリアステンプレートではなく専門のことを行うことができます。

template<auto... values_> 
using VTuple = Tuple<constant_t<values_>... >; 

しかし、それは別のテンプレートです。

+0

私は(エイリアス) –

+0

を避けようとしてきましたが、大丈夫ですが、なぜプライマリテンプレートを値を受け入れるように変更できないのかについての説明がありますか? –

+4

@FletcherBlight - 特化の本質によって。値は、より特殊化された型の型ではありません。それはちょうど*型を持っています。それが型を持っているという事実は型の代わりに使うことを許しません。 – StoryTeller

関連する問題