嵌套 STL 容器本身 N 次

Nesting STL Container in itself N times

提问人:Mark Tikhonov 提问时间:3/17/2023 更新时间:3/17/2023 访问量:59

问:

有没有办法以重复的方式将 STL 容器本身嵌套为模板参数 n 次?

例:

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

int main(){

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


}
C++ 模板 STL

评论


答:

2赞 273K 3/17/2023 #1

像这样的东西

#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, ...>>>
}
4赞 Peter 3/17/2023 #2

尝试类似的东西

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_typeNester<1u>::vec_typestd::vector<int>Nester<2u>::vec_typestd::vector<std::vector<int> >Nester<Nesting>::vec_type

则为 介于 和 之间。Nester<n>::my_vecNester<n>::vec_typen1Nesting

专业化就在那里,因为(如果没有这种专业化)构造一个将产生非常深的递归(并且,根据编译器的实现,会导致可诊断的错误或崩溃的编译器)。Nesting<0u>Nesting<0u>

我使用了一个类型作为模板参数,因为有一个否定对我来说没有意义。unsignedNesting