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

Defining variable type based on a boolean in c++

本文关键字:定义 变量 类型 于布尔 c++      更新时间:2023-10-16

根据布尔变量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语句。使用三元操作符(扩展在if/else序列中初始化的变量的作用域)似乎不适用,因为变量类型不同。

我这样做的动机是我有一个重载函数myFn,一个版本输入vector,另一个版本输入vector<vector>。出于性能原因,我不希望在myFn中放置if语句来区分不同的情况——我希望在声明时调用单个if语句,而在重复调用myFn

时不调用万亿if语句。

编辑:
这是一个物理模拟。我想保持做1D或2D计算的能力,myFn分别做1D或2D插值。除了变量的不同初始化之外,我不想修改任何代码库,因此我希望保持变量名称相同,以便我可以调用相同的重载插值器,也不希望在插值器

中使用if语句。

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

这在c++中是不可能实现的。您有两个选项:

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

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

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

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

class MyVector {
public:
   virtual ~MyVector();
...
};
class MyVector1D : public MyVector {
};
class MyVector2D : public MyVector {
};
// usage
std::unique_ptr<MyVector> vector = myBool ? std::make_unique<MyVector1D>() 
                                          : std::make_unique<MyVector2D>();
myFn( vector );
也可以在访问模式或条件代码中使用boost::variant。