一种特定类型

时间:2015-06-11 06:27:10

标签: c++ templates c++11 language-lawyer variadic-templates

为什么可变参数模板包中不允许特定类型?

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 >没有缩小类型和{ } - 大括号语法
  • 一个(丑陋的)递归特征,分别检查所有类型:see here

1 个答案:

答案 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