5

我可以写成

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 !!!
};

什么问题?

4

2 回答 2

5

有一个可能发生包扩展的语言结构的税收清单(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;
};
于 2013-09-27T08:02:22.190 回答
3

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

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

using T = std::tuple<decltype(T{})...>;
于 2013-09-27T07:57:15.407 回答