C ++根据用户输入制作变量类型

时间:2015-02-08 13:51:30

标签: c++ arrays

我想要一个为测试目的创建数组的函数:

  • 让用户选择数组将包含的元素类型(int,float,double)的想法。
  • 然后它必须返回所选类型的数组, main 必须将其用作参数。我知道这是使用无效指针完成的,但如果有人能为我提供一个例子,我会很高兴。

所以这就是示例代码

    **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。

以及如何正确完成后如何在其他功能上使用它。

感谢。

4 个答案:

答案 0 :(得分:2)

由于C ++是一种静态类型语言,因此您无法以简单的方式实现此目的。您无法在运行时确定类型,一旦编译完程序就会修复这些类型。

你最接近你的案例恕我直言,是使用boost::variantboost::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)