Khu*_*dov 5 c++ variadic-templates c++11
我可以写作
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`
};
Run Code Online (Sandbox Code Playgroud)
但是,当我使用可变参数模板时,它不会被编译:
template< class ... T> struct Last{
using type = decltype(T{} ... ); //<--- Error !!!
};
Run Code Online (Sandbox Code Playgroud)
什么问题?
有一个语言结构的分类列表,其中可以发生包扩展(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;
};
Run Code Online (Sandbox Code Playgroud)