【问题标题】:Variadic template parameters of one specific type一种特定类型的可变参数模板参数
【发布时间】:2023-03-22 11:25:01
【问题描述】:

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

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&lt; T &gt; 没有缩小类型和 { }-brace-syntax
  • 一个(丑陋的)递归特征,分别检查所有类型:see here

【问题讨论】:

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


    【解决方案1】:

    这是允许的,实际上,你只是用错了。 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

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多