基于c ++中的布尔值定义变量类型

时间:2015-07-16 12:53:33

标签: c++ scope

取决于布尔变量myBool我想将变量mVect声明为1D或2D向量,即:

  if (myBool){
       vector < vector< float > > myVect;
   }
   else{
       vector <float> myVect;
   }

  ///// later.....//////

 //call many instances of overloaded myFn( vector<float>), 
 //or  myFn ( vector<vector<float>)

   //// more stuff.....//
  // call more instances of myFn    

我希望变量的范围超出if语句。使用(Expand scope of a variable initialized in a if/else sequence)中的三元运算符似乎不适用,因为变量类型不同。

我的动机是我有一个重载函数myFn,一个版本输入vector,另一个版本输入vector<vector>。我不想在myFn中添加if语句来区分出于性能原因的情况 - 我想在声明而不是调用万亿时调用单个if语句重复调用if

时的myFn语句

修改
这是用于物理模拟。我想保留进行1D或2D计算的能力,myFn分别进行1D或2D插值。除了不同的变量初始化之外,我不想修改任何代码库,因此我想保持变量名称相同,因此我可以调用相同的重载内插器,也不想在内插器中使用if语句

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你希望局部变量根据布尔值的运行时值具有不同的类型。

这在C ++中是不可能的。你有两个选择:

1)如果布尔值是const(或来自constexpr),您可以将代码转换为模板,并使用std::conditional选择正确的类型。

2)在if的相应范围内完成所有工作,然后变量不同,并且它们具有不同类型没有问题:

  if (myBool){
       vector < vector< float > > myVect;
       ...
       myFn(myVect);
   }
   else{
       vector <float> myVect;
       ...
       myFn(myVect);
   }

答案 1 :(得分:0)

解决方案之一 - OO。您创建一个基类,其中包含在您的代码和插补器中使用的接口,然后根据条件从它继承1d或2d:

#include <stdio.h>
#include <stdlib.h>

int (*multiTable(unsigned int xs, unsigned int ys))[]
{
    unsigned int i, j;
    int (*table)[xs] = malloc(ys * sizeof *table);
    for (i = 0; i < ys; i++)
    for (j = 0; j < xs; j++)
       table[i][j] = (j+1) * (i+1);
    return table;
}

int main()
{
    const int xs = 3, ys = 2;
    int (*sum)[xs];
    sum = multiTable(xs, ys);
    int i, j;
    for (i = 0; i < ys; i++, puts(""))
    for (j = 0; j < xs; j++)
       printf("%d", sum[i][j]);
    return 0;
}

或者您可以将boost :: variant与访问者模式或使用该向量的条件代码一起使用。