提问人:Mark Tikhonov 提问时间:3/17/2023 更新时间:3/17/2023 访问量:59
嵌套 STL 容器本身 N 次
Nesting STL Container in itself N times
问:
有没有办法以重复的方式将 STL 容器本身嵌套为模板参数 n 次?
例:
template<int Nesting>
struct Nester{
vector<...> my_vec;
};
int main(){
Nester<3> nester;
//typeof(nester.my_vec) -> vector<vector<vector<int>>>
}
答:
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_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
评论