具有许多基本情况的模板递归
template recursion with many base cases
目标是从另一个元组创建一个元组(并提取其类型),方法是在位置START处获取其组件,然后跳过每个INTERVAL组件。甚至不需要参数包:
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);
}
如何处理任意值INTERVAL的所有基本情况?代码可以正常工作,并且测试INTERVAL大小为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在某种程度上冲突(这是提取类型)。也许只有那部分需要修理。
您可以使用以下技术创建一个逻辑测试:
#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};
};
生活例子
要美化模板签名,您可以将void
hack粘贴到实现细节命名空间中,并将公共接口转发到那里。
相关文章:
- 为什么这个递归没有得到它的基本情况?
- 递归楼梯中的基本情况
- C++ 循环链表的递归基本情况
- 视觉 在C++中,我试图在没有递归的情况下循环访问许多对象
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 如何将递归函数(具有两个基本情况)转换为迭代函数
- 转换循环以递归基本方法
- 摆脱可变参数模板递归基本情况下不必要的类
- 具有空参数包的递归可变参数模板(以避免基本情况的重复)
- 这段代码如何在没有任何循环语句或'goto'或递归的情况下循环?
- 在不使用递归的情况下将 FFT 应用于两个非常大的数字的乘法
- 如何在没有递归的情况下删除链接列表
- 可以在没有递归的情况下发现矩阵的决定因素
- 如何在不使用递归的情况下获取二叉树的最小高度
- 使用递归进行硬币更改的基本情况是什么
- 如何在这个程序中编写关于递归的基本情况
- 如何在没有递归的情况下清除四叉树(也许使用队列?).
- 在不超过y次递归的情况下,一个数可以被提升到的最大功率
- 如果数字为负数,为什么递归求解中查找给定序列中最大子序列的基本情况会返回0
- 有没有一种方法可以在不使用递归的情况下迭代n维数组(其中n是变量)