有没有一种方法可以将STL容器作为模板参数重复嵌套n次?示例:
template<int Nesting> struct Nester{ vector<...> my_vec; }; int main(){ Nester<3> nester; //typeof(nester.my_vec) -> vector<vector<vector<int>>> }
brc7rcf01#
试试这样
template<unsigned Nesting> struct Nester { using vec_type = std::vector<typename Nester<Nesting - 1>::vec_type>; vec_type my_vec; }; template<> struct Nester<1u> { using vec_type = std::vector<int>; vec_type my_vec; }; template<> struct Nester<0u> { // do nothing };
这使用递归构建了一个Nester<Nesting>::vec_type,使得Nester<1u>::vec_type是std::vector<int>,Nester<2u>::vec_type是std::vector<std::vector<int> > ......,直到它定义了Nester<Nesting>::vec_type。那么Nester<n>::my_vec的类型是Nester<n>::vec_type,因为n在1和Nesting之间。专门化Nesting<0u>就在那里,因为(没有专门化)构造一个Nesting<0u>将给予非常深的递归(并且,取决于编译器实现,导致可诊断错误或编译器崩溃)。我使用unsigned类型作为模板参数,因为Nesting为负对我来说没有意义。
Nester<Nesting>::vec_type
Nester<1u>::vec_type
std::vector<int>
Nester<2u>::vec_type
std::vector<std::vector<int> >
Nester<n>::my_vec
Nester<n>::vec_type
n
1
Nesting
Nesting<0u>
unsigned
b4lqfgs42#
就像这样
#include <iostream> #include <vector> template<int N> struct Nester { typedef std::vector<typename Nester<N - 1>::type> type; type my_vec; }; template<> struct Nester<0> { typedef int type; }; int main() { Nester<0> n0; Nester<1> n1; Nester<2> n2; Nester<3> n3; std::cout << typeid(n1.my_vec).name() << std::endl; std::cout << typeid(n2.my_vec).name() << std::endl; std::cout << typeid(n3.my_vec).name() << std::endl; n3.my_vec = 1; // just for test: // error: no known conversion from 'int' to 'const std::vector<std::vector<std::vector<int, ...>>> }
2条答案
按热度按时间brc7rcf01#
试试这样
这使用递归构建了一个
Nester<Nesting>::vec_type
,使得Nester<1u>::vec_type
是std::vector<int>
,Nester<2u>::vec_type
是std::vector<std::vector<int> >
......,直到它定义了Nester<Nesting>::vec_type
。那么
Nester<n>::my_vec
的类型是Nester<n>::vec_type
,因为n
在1
和Nesting
之间。专门化
Nesting<0u>
就在那里,因为(没有专门化)构造一个Nesting<0u>
将给予非常深的递归(并且,取决于编译器实现,导致可诊断错误或编译器崩溃)。我使用
unsigned
类型作为模板参数,因为Nesting
为负对我来说没有意义。b4lqfgs42#
就像这样