[英]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.