通配矢量模板

时间:2011-05-03 16:14:06

标签: c++

我必须根据用户输入创建特殊类型的矢量。 例如用户必须选择是否要创建一个int矢量或一个字符串矢量。 是否有可能预定义一个矢量并在一个例子中清楚地定义它。开关情况?

类似的东西:

vector<WILDCARD> vec;
switch(input) {
case 1:
    vec = vector<int>()...
    break;

case 2:
    vec = vector<string>()....
    break;
....

4 个答案:

答案 0 :(得分:4)

  

是否可以预先定义一个矢量并在一个例子中清楚地定义它。开关情况?

没有。 C ++是一种静态类型的语言。这意味着,必须在编译时知道每个变量的类型,并且一旦知道它,就不能在以后更改 - 甚至在编译时也不会。所以你正在做的事情是不可能的。

如果您想让用户选择类型。然后,您可以在每个case中定义所有可能选项的变量,并与用户选择的变量一起使用,如下所示:

switch(input) {
case 1:
    { 
         std::vector<int> vec;
         //work with vec which is vector of int!
    }
    break;
case 2:
    { 
         std::vector<std::string> vec;
         //work with vec which is vector of string!
    }
    break;
    //....

或者,如果你担心代码重复,那么你可以这样做:

template<typename T>
void Work()
{
     std::vector<T>  vec;
    //work with vec of type T
}

switch(input) {
case 1:
    Work<int>();
    break;
case 2:
    Work<std::string>();
    break;
    //....

答案 1 :(得分:3)

不,你不能。 根据开关盒类型在开关盒中创建矢量。

switch(input) {
case 1:
    vector<int> vec1;
    vec1 = ...
    break;

case 2:
    vector<String> vec2;
    vec2 = ....
    break;
....

答案 2 :(得分:2)

由于c ++是静态类型的,所以你不能这样做。 但我想boost::anyboost::variant会让您靠近您想去的地方。

答案 3 :(得分:0)

C ++是一种静态类型语言,因此vec必须具有预定类型。

你可能想要做的是将你在vec中使用的内容包装在一个对象中,也许是一个抽象基类,它没有提到矢量基类型是什么,还有两个子类,一个用于intstring一个。然后,您将使用虚函数来封装vector<int>版本和vector<string>版本之间的差异。