为什么可变参数模板包中不允许特定类型?
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 >
没有缩小类型和{ }
- 大括号语法答案 0 :(得分:6)
实际上,你只是允许使用它。 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,2,3>();
}
另一个例子是std::integer_sequence
。