我想要一个为测试目的创建数组的函数:
所以这就是示例代码
**type** vector()
{
int t;
int op;
cout << "Size: \n";
cin >> t;
**type** * v = new **type**[t]
cout << "Select type\n";
cin >> op;
switch(op) {
case 0:
// Create the array with the selected option...
return * v;
case 1:
// Create the array with the selected option...
return * v;
default:
// Other stuff;
}
}
所以问题是我应该使用什么类型的函数,以及我应该将什么类型的动态变量声明为v。
以及如何正确完成后如何在其他功能上使用它。
感谢。
答案 0 :(得分:2)
由于C ++是一种静态类型语言,因此您无法以简单的方式实现此目的。您无法在运行时确定类型,一旦编译完程序就会修复这些类型。
你最接近你的案例恕我直言,是使用boost::variant
或boost::any
之类的东西。
答案 1 :(得分:2)
简单的答案是不能,因为数据类型需要在编译时专门声明。
如果你可以使用升级库,
boost::variant<int,float,double> vec;
可以满足您的需求。
您无法使用union
,因为std::vector
不是 POD (普通旧数据类型)。
编辑:
正如@Rob指出的那样:
无效指针需要转换为指向其他东西的指针 - 在编译时 - 在他们可以这样使用之前。所以答案是 仍然&#34;不能&#34;使用void指针生成可变数据类型。
答案 2 :(得分:1)
我认为你应该重新思考你的设计。
而不是尝试编写一个返回用户定义类型数组的函数来进行测试。我会根据用户的选择调用不同的测试功能。
可以模拟测试函数以避免代码重复:
#include <vector>
#include <iostream>
template<typename T>
void doTest(unsigned size) {
std::vector<T> data(size);
// Do the actual test on the data...
}
int main() {
unsigned size;
std::cout << "Size: \n";
std::cin >> size;
int op;
std::cout << "Select type\n";
std::cin >> op;
switch(op) {
case 0:
doTest<int>(size);
break;
case 1:
default:
doTest<float>(size);
}
}
如果你真的想从一个函数返回你的数组,你可以将它包装成多态类型。但是要实际对数组做任何事情,你需要在多态类型上调用一个虚方法,所以我不知道如何通过直接调用测试函数来购买任何东西。
答案 3 :(得分:0)
可以使用void*
来完成,但在这种情况下,您需要自己进行类型转换(如@Rob所指出的),即使用reinterpret_cast
运算符或类似操作符。这是一个带有void *
void* vector(){
int t;
int op;
cout << "Size: \n";
cin >> t;
cout << "Select type\n";
cin >> op;
switch(op) {
case 0:
// Create the array with the selected option...
return reinterpret_cast<void*>(new int[t]);
case 1:
// Create the array with the selected option...
return reinterpret_cast<void*>(new double[t]);
default:
// Other stuff;
return reinterpret_cast<void*>(new float[t]);
}
}
注意:您可以查看malloc()
函数的工作情况,它总是将void*
返回到已分配的内存,您必须自己输入,例如malloc(sizeof(int)*t)