为什么可变参数模板包中不允许特定类型?
template< typename T > class Foo { public: template< typename... Values > void bar( Values... values ) { } template< T... values > <-- Syntax error void bar( T... values ) { } template< int... values > <-- Syntax error void bar( int... values ) { } };
什么是不允许这样做的理由?
有这个建议吗?
注意:替代方案是
> std :: initializer_list< T>没有缩小类型和{} -brace语法
>一个(丑陋的)递归特征,分别检查所有类型:see here
解决方法
实际上,你只是允许它使用它是错误的. T …和int …是非类型参数包,它们的元素是值,因此您不能将它们用作类型说明符(并且您不能从函数调用中推断它们).
正确用法的一个例子:
template<int... Is> struct IntPack {}; IntPack<1,2,3> p;
要么
template< typename T > struct Foo { template< T... Ts> void bar() { } }; int main() { Foo<int> f; f.bar<1,3>(); }
另一个例子是std::integer_sequence
.