我写了一个小using
语句,可以轻松访问可变参数模板参数包的类型。
template<size_t index, typename args...>
using get = std::tuple_element<index, std::tuple<args...>>::type;
但是用clang(3.5.0)或gcc(4.9.0)编译它会失败。这是clang的错误输出:
error: expected ',' or '>' in template-parameter-list template<size_t index, typename args...>
^
using
语句是否不能与可变参数模板组合?或者我做错了什么?
答案 0 :(得分:6)
参数包的省略号必须位于typename
(或class
)关键字之后。扩展包时它会在参数名称之后。
template<size_t index, typename... args>
// ^^^
using get = typename std::tuple_element<index, std::tuple<args...>>::type;
// ^^^^^^^^^
您还缺少引用嵌套相关类型时所需的typename
关键字。
答案 1 :(得分:4)
您的代码有两个问题。
首先,由于std::tuple_element<...>
的定义取决于...
是什么,因此您需要告诉编译器::type
引用类型名称,因此您需要typename
在它面前。
其次,可变参数模板参数的省略号介于typename
(或class
)和包的名称之间,即typename ...args
而不是typename args...
。
所以固定代码是:
template<size_t index, typename ...args>
using get = typename std::tuple_element<index, std::tuple<args...>>::type;