【发布时间】:2020-09-29 11:40:40
【问题描述】:
我的目标是定义一个Recursive 类,以int N 和一个或多个类型T, ...Ts 为模板,其行为应类似于std::pair
-
N中的std::array类型为T的项目first, - 并且,作为
second,一个可选std::vector的Recursive实例在相同N和其余模板参数Ts...上模板化.
在尝试根据上述要求写下类时,我想出了这个非工作代码(我还定义了一些必要的代码,因为它们很有帮助,Recursive 的两个实例化的别名),而且我不知道我是否错误地设计了我上面描述的内容(或者它是否是一个格式错误的描述!),或者我是否滥用了语言语法。
#include <array>
#include <boost/hana/fwd/optional.hpp>
#include <boost/hana/optional.hpp>
#include <string>
#include <utility>
#include <vector>
template <int N, typename T1, typename T2, typename ...Ts>
struct Recursive
: std::pair<std::array<T1, N>,
boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>> {};
template <int N, typename T>
struct Recursive<N, T> : std::array<T, N> {};
template<typename ...T>
using Recursive2 = Recursive<2u, T...>;
template<typename ...T>
using Recursive3 = Recursive<3u, T...>;
int main() {
using boost::hana::nothing;
Recursive2<int> x(std::make_pair(std::array<int, 2>{0,0}, nothing));
}
我将添加一些到目前为止我已经完成的故障排除。在下面的模板规范似乎工作得很好。
#include <iostream>
template <int N, typename T, typename ...Ts>
struct Recursive {
void operator()(){ std::cout << "general\n"; }
};
template <int N, typename T>
struct Recursive<N, T> {
void operator()(){ std::cout << "specialized\n"; }
};
template<typename ...T>
using Recursive2 = Recursive<2u, T...>;
template<typename ...T>
using Recursive3 = Recursive<3u, T...>;
int main() {
Recursive2<int>{}();
Recursive2<int>{}();
Recursive2<int,int>{}();
}
【问题讨论】:
-
评论后验:由于
std::vector可以有零个元素,因此将其包装在可选中可能真的没有意义;一个空的std::vector已经代表递归的结束。
标签: c++ c++17 variadic-templates template-meta-programming boost-hana