在c++中基于布尔值定义变量类型
Defining variable type based on a boolean in c++
根据布尔变量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插值。除了变量的不同初始化之外,我不想修改任何代码库,因此我希望保持变量名称相同,以便我可以调用相同的重载插值器,也不希望在插值器
如果我正确理解你的问题,你想要一个局部变量根据布尔值的运行时具有不同的类型。
这在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 );
相关文章:
- 在头文件中定义变量不会出错
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 在命名空间中定义变量
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用不同类型重新定义变量
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 定义变量类型
- 在命名空间中定义变量,但在测试中获取空值
- cmake没有定义变量
- C 中的继承:在亲子类中定义变量
- 在同一函数中定义变量及其静态等效项
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 如何将 int 和 int* 传递到函数中以定义变量
- 在定义变量时调用类函数
- 定义变量与模板
- 定义变量类型
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- C 如何基于另一个变量和某些算术定义变量的值
- C 可以指向具有定义变量的函数
- C 定义变量设置值