繁体   English   中英

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

[英]Defining variable type based on a boolean in c++

根据一个布尔变量myBool我想声明变量mVect作为一维或二维矢量,即:

  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语句来区分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与访问者模式或使用该矢量的条件代码一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM