【发布时间】:2018-04-18 06:02:30
【问题描述】:
在 C++ 中,是否可以生成深度(维度)等于用户定义输入的嵌套向量?例如,如果用户输入一个值为 2 的整数,那么一个人的程序可能会创建一个 vector< vector< vector<int> > > 类型的对象。显然,还有许多其他方法可以轻松地在 C++ 中实现类似的行为,但我纯粹对实际生成任意嵌套向量是否可能感兴趣。最初,我认为这很简单,但我的实现都以相当奇怪的方式失败了。
#include<iostream>
#include<vector>
using namespace std;
template<typename A> void vec_print(vector<A> in){
cout << "{";
for(typename vector<A> :: iterator i = in.begin(); i != in.end(); ++i){
cout << *i << ", ";
}
cout << "}" << endl;
}
template<typename B> void vec_print(vector< vector<B> > in){
cout << "{";
for(typename vector< vector<B> > :: iterator i = in.begin(); i != in.end(); ++i){
vec_print(*i); cout << ", ";
}
cout << "}" << endl;
}
template<typename T> auto generate(unsigned int d){
if(d == 0){
vector<T> in;
return in;
}
return generate< vector<T> >(d - 1);
}
int main(){
unsigned int d = 0;
cin >> d;
vec_print(generate<int>(d));
return 0;
}
最初,我认为这可能有效,但由于我对 C++ 编译器如何处理模板函数的理解,我对此颇有怀疑。使用带有 --std=c++11 标志的 g++ 编译器,在崩溃之前,g++ 编译器递归地发出错误,通知我函数返回类型推导仅在 C++17 规范下可用。尝试使用--std=c++17 标志编译此程序不会导致任何错误,但编译器只是崩溃了。我怀疑编译器试图生成无限数量的,或者可能是 2^31 个模板函数,尽管我希望它能够处理这个问题,并发出无限模板函数生成的错误警告,而不是静默死亡。
【问题讨论】:
-
您认为如何访问嵌套向量?我认为,一个是为树状结构创建类,例如一个基类
Vec,一个类VecInt: Vec和一个成员vector<int>,一个类VecVec: Vec和一个成员vector<Vec*>以及管理它的适当虚拟方法。 -
编译器无法推断出
generate<int>(d)的类型。 (你也不能。) -
@molbdnilo 编译器是否无法推断返回类型,它不应该输出错误通知我吗?无论如何,我完全知道所提供的代码无法编译。我只是从完全理论的、非实践的角度询问是否可以在 C++ 中生成用户定义维度的 std::vector 容器。我虽然提供的代码可能会增加我所要求的内容的清晰度。在用户输入之前,是的,无法推断返回类型。我同意了。
-
@Scheff 访问任意嵌套向量的元素可以通过递归重载模板函数来实现,例如我的代码中的 vec_print 函数。我已经使用这个函数来访问过去项目的各种维度的 std::vectors。
-
是的,它应该抱怨。崩溃是一个编译器错误,您应该报告它。但是类型不能依赖于运行时值。
标签: c++ c++11 templates vector c++17