Variadic模板和类型定义,使用'

时间:2014-06-22 18:54:37

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

我写了一个小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语句是否不能与可变参数模板组合?或者我做错了什么?

2 个答案:

答案 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;