创建不明确类型的向量,或转义变量范围?

Creating a vector of ambiguous type, or escaping variable scope?

我被分配了一个 C++ class (heh) 作业,其中规定我必须编写一个程序来对数据向量执行特定操作。数据可以是 int 类型或 double 类型。程序必须首先询问用户将使用哪种类型,然后声明适当的向量,并将其用于程序的其余部分。我在想这些:

// Determine type of data values
cout << "What type of values: Int (1), or Double (2)?" << endl
     << "Type: ";
int entry;
cin >> entry;
cin.ignore();

// Execute a typedef accordingly
switch (entry)
{
case 1:
    typedef int TYPE;
    break;
case 2:
    typedef double TYPE;
    break;
default:
    typedef double TYPE;    // Defaults to double
    break;
}

// Declare the vector
vector<TYPE> numbers;

然而,这并没有起作用,因为 typedef 语句的范围没有超出它们在 switch 语句中的大小写。

我尝试的其他方法是创建一个 void 指针,然后将其分配给正确的向量,如下所示:

// Declare pointer
void * numbers = nullptr;

// Declare both possible vectors
vector<int> intVector;
vector<double> doubleVector;

// Assign pointer to proper vector
switch (entry)
{
case 1:
    numbers = &intVector;
    break;
case 2:
    numbers = &doubleVector;
    break;
default:
    numbers = &doubleVector;
    break;
}

这看起来应该可行,对吧?好吧,我遇到了另一个范围问题:出于某种原因,我在开关的 numbers 上收到 "undefined identifier" 错误...whaaaa?

然后,我尝试使用 typename 变量,但显然这不是 C++ 中的事情。 (类似于 typename TYPE; ... TYPE = double; ... vector<TYPE> numbers;

然后出现了一个聪明的想法:编写一个模板化的 MAKE_VECTOR() 函数,returns 一个指向模板类型向量的指针,然后让它接受一个相同类型的参数指定矢量类型。这很难解释;这是代码:

// Returns a pointer to a new vector of a specified type.     template<typename T>
vector<T> * MAKE_VECTOR(T var)
{
    void * ptr;
    vector<T> vec;
    ptr = &vec;

    return ptr;
}

这似乎有效。函数声明中没有语法错误,但是当我去使用它时...

void * numbers;

// Determine type
...

switch(entry)
{
case 1:
    numbers = MAKE_VECTOR((int)1);
    break;
    ...
}

// Test
numbers->push_back(2);

无效。错误:Expression must have pointer-to-class type. 我上网查了下,发现必须先解引用指针,对吧?所以我尝试了 (*numbers)->push_back(2);,但也没有类似的方法。

我没主意了。我该怎么办?

哇。那真是怪了。我只是再次尝试了方法#2,即 void 指针,它起作用了。卧槽,Visual Studio.