目标是从另一个元组创建元组(并提取其类型),方法是在位置开始时获取元组的组件,然后跳过每个间隔组件。甚至不需要参数包:
template <int NUM_LEFT, int START, int INTERVAL>
struct alternating_tuple_helper {
template <typename TUPLE>
auto operator() (const TUPLE& t) const
-> decltype (std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))) {
return std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t));
}
};
template <int START, int INTERVAL>
struct alternating_tuple_helper<0, START, INTERVAL> { // first base case
template <typename TUPLE>
std::tuple<> operator() (const TUPLE& t) const {return std::tuple<>();}
};
template <int START, int INTERVAL>
struct alternating_tuple_helper<-1, START, INTERVAL> { // second base case
template <typename TUPLE>
std::tuple<> operator() (const TUPLE& t) const {return std::tuple<>();}
};// ...基本情况必须包括0,-1,-2,...深入到-INTERVAL+1,该怎么做呢?
template <typename TUPLE, int START = 0, int INTERVAL = 2> // extracting the type
struct alternating_tuple_type {
using type = decltype (alternating_tuple_helper<std::tuple_size<TUPLE>::value - START, START, INTERVAL>()(std::declval<TUPLE>()));
};
template <typename TUPLE, int START = 0, int INTERVAL = 2> // getting the new tuple itself
typename alternating_tuple_type<TUPLE, START, INTERVAL>::type alternating_tuple (const TUPLE& t) {
return alternating_tuple_helper<std::tuple_size<TUPLE>::value - START, START, INTERVAL>()(t);
}如何处理所有具有任意值区间的基本情况?代码在其他情况下工作,并测试间隔大小为10 (是的,目前我正在使用宏来覆盖0,-1,-2,...,-10,但这当然很糟糕)。
我试过了
template <int NUM_LEFT, int START, int INTERVAL>
struct alternating_tuple_helper {
template <typename TUPLE>
auto operator() (const TUPLE& t) const
-> std::conditional<(NUM_LEFT > 0), decltype (std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))), std::tuple<>> {
return (NUM_LEFT > 0) ? std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))
: std::tuple<>();
}
};但它无法编译,因为它以某种方式与alternating_tuple_type冲突(这是为了提取类型)。也许那时只需要修复这一部分。但我不确定问题到底出在哪里。
发布于 2014-06-15 09:05:53
您可以使用此技术创建逻辑测试:
#include <utility>
template<int n, int m, class=void>
struct count{
enum{value=1 +count<n-m, m>::value};
};
template<int n, int m>
struct count<n,m, typename std::enable_if<(n<m)>::type>{
enum{value=0};
};live example
为了美化模板签名,您可以将void hack放在一个实现细节命名空间中,并将公共接口转发到那里。
https://stackoverflow.com/questions/24224403
复制相似问题