取决于布尔变量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语句
答案 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与访问者模式或使用该向量的条件代码一起使用。