2014-01-16 22 views
3

如何访问参数包中的各个项目?如何创建参数包的第一个参数的typedef

考虑以下几点:

template<typename T> 
struct X {}; 

template<class R, class... Args> 
struct X<R (Args...)> 
{ 
    // how can I create a typedef for the first parameter 
    // basically I want to do something like if arg1 exists typedef it 
    // pseduo code below 

    if (Args[0]) 
    typedef typename Args[0] Parameter1 
} 

否则我可能会做这样的事情,但希望保留它通用

template<class R, class... Args> 
struct X<R (Arg1, Args...)> 
{ 

} 
+0

'X'的其他成员是否会使用这个'typedef'?怎么样?如果'Args'是空的,你想'typedef'不存在,或者是'void'? – Casey

回答

5

您可以使用std::tuple_element

template<typename... Args> 
struct arg 
{ 
    template<int N> 
    using type = typename std::tuple_element<N, std::tuple<Args...>>::type; 
}; 

template<typename R, typename... Args> 
struct X<R (Args...)> 
{ 
    using first = typename arg<Args...>::template type<0>; 
}; 

这将允许您通过编译时索引访问任意类型。您也可以使用static_assert在编译时断言参数包至少包含一个元素。

template<typename... Args> 
struct has_first_arg : std::true_type { }; 

template<> 
struct has_first_arg<> : std::false_type { }; 

template<typename R, typename... Args> 
struct X<R (Args...)> 
{ 
    static_assert(has_first_arg<Args...>::value, 
        "Parameter pack must have at least one element"); 
}; 
+0

'arg :: type <0>''不会编译;你需要'template'关键字在这里:'arg ::模板类型<0>';-) – Nawaz

+0

@Nawaz我还在努力。同时,你能解释为什么吗? :) – 0x499602D2

+0

这里您需要template关键字:'arg ::模板类型<0>'。 :-) – Nawaz

7

获得在参数包中的第一项是与助手很简单:

template <typename T, typename... Ts> 
using first_type = T; 

然而,这当然将无法编译,如果你的参数组是空的。当你的包装是空的时,你期望什么样的行为?你不想让typedef存在吗?在这种情况下,只需部分专门化您的struct X以获取空参数包的情况。

+0

感谢此+1。我结束了使用模板专门化的零参数案例 – bjackfly

+0

没问题。很高兴我能够帮忙。 – bstamour

相关问题