c++ 将STL容器嵌套在自身中N次

00jrzges  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(125)

有没有一种方法可以将STL容器作为模板参数重复嵌套n次?
示例:

template<int Nesting>
struct Nester{
 vector<...> my_vec;
};

int main(){

Nester<3> nester;
//typeof(nester.my_vec) -> vector<vector<vector<int>>>

}
brc7rcf0

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_typestd::vector<int>Nester<2u>::vec_typestd::vector<std::vector<int> > ......,直到它定义了Nester<Nesting>::vec_type
那么Nester<n>::my_vec的类型是Nester<n>::vec_type,因为n1Nesting之间。
专门化Nesting<0u>就在那里,因为(没有专门化)构造一个Nesting<0u>将给予非常深的递归(并且,取决于编译器实现,导致可诊断错误或编译器崩溃)。
我使用unsigned类型作为模板参数,因为Nesting为负对我来说没有意义。

b4lqfgs4

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, ...>>>
}

相关问题