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

3

decltypeパックではなく式にのみ適用できます。パックは非常に特殊で、基本的に常に拡張する必要があります。基本的に、パックを直接保存できないのと同じ問題がありusing type = T...ます。それも許可されていません。

標準的な解決策は、いくつかの「コンテナ テンプレート」内にパックを格納することです。通常は次のようになりtupleます。

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