【问题标题】:variadic template pack within decltypedecltype 中的可变参数模板包
【发布时间】:2013-09-27 19:44:54
【问题描述】:

我可以写成

template< class T0> struct Last0
{  
  using type = decltype(T0{}); // OK compiles. `type = T0`
};


template< class T0, class T1> struct Last1
{
    using type = decltype(T0{}, T1{}); // OK, compiles. `type = T1`
};

template< class T0, class T1, class T2> struct Last3{
   using type = decltype(T0{}, T1{}, T2{}); // Ok, compiles. `type = T2`
};

但是,当我使用可变参数模板时,它没有被编译:

template< class ... T> struct Last{
   using type = decltype(T{} ... ); //<--- Error !!!
};

有什么问题?

【问题讨论】:

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


    【解决方案1】:

    有一个可能发生包扩展的语言结构的税收清单(C++11,14.5.3§4)。除了sizeof... 之外,它总是在逗号, 是列表的语法分隔符而不是运算符的构造中。表达式不能是包扩展。

    要获取包中的最后一个类型,您可以这样做:

    template <class Head, class... Tail>
    struct Last {
      typedef typename Last<Tail...>::Type Type;
    };
    
    template <class Head>
    struct Last<Head> {
      typedef Head Type;
    };
    

    【讨论】:

      【解决方案2】:

      您只能将decltype 应用于表达式,而不能应用于包。包很特别,基本上总是需要扩充。您基本上遇到了与无法直接存储包相同的问题:using type = T... 也是不允许的。

      标准的解决方案是将包存储在一些“容器模板”中,通常是tuple

      using T = std::tuple<decltype(T{})...>;
      

      【讨论】:

      • 我相信 OP 实际上是在尝试将包扩展为逗号运算符列表,以获取包中最后一个成员的类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多