【发布时间】:2020-07-15 15:05:36
【问题描述】:
我必须创建一个名为 m2DArray 的数组。它有 2 行和 5 列,即 [2][5] 的大小。
数组可以是float** 或double**,我只在运行时才知道。
由于我在编译时不知道类型,所以我在头文件中将其初始化为
void **m2DArray;
然后我创建一个模板函数:
template <typename SampleType>
void MyClass::initiliaze2DArray(SampleType** m2DArrayTyped)
{
m2DArray = new SampleType* [2]; //2 rows
int32 sizeOfOneCol = 5 * sizeof(SampleType); // 5 cols
for (int32 row = 0; row < 2; row++)
{
m2DArray[row] = new SampleType [sizeOfOneColumn];
memset(m2DArray[row], 0, sizeOfOneCol);
}
}
然后在运行时,我根据类中的一些逻辑在 float** 或 double** 之间做出选择,并相应地尝试初始化 2d 数组。
if (somelogictellsfloat){
float **mArrayFloat;
initiliaze2DArray(mArrayFloat);
}
else {
double **mArrayDouble;
initiliaze2DArray(mArrayDouble);
}
但是,当尝试初始化这个二维数组时,我无法在模板函数中将 void** 转换为 float** 或 double**。
我收到以下错误:
错误:在 m2DArray = new SampleType* [2] 行中从“double**”到“void**”的无效转换;
我的问题:
如何将 **m2DArray 从 void ** 转换为 float ** 或 double ** ?或者有没有更好的方法在运行时创建这个二维数组。
【问题讨论】:
-
有什么理由不能使用包装类,比如
template<typename SampleType> class Array2D?如果对象必须从一开始就存在,则创建一些接口Array2DBase,模板类从该接口继承并创建指向该接口的指针。 -
@Aziuth 谢谢,我不能使用类模板,因为它是更大代码库的一部分,我真的没有那种独立性来修改类以使用模板。
-
另外,
m2DArray是一个全局变量吗?如果是这样,尝试重写它,无论如何都是邪恶的。编辑:啊,好吧,你必须使用的其他代码,明白了。 -
我想到了一个
union,或者(更好)一个std::variant(但后者已经在C++17中引入)。 -
@bhaskarc
if (typeisFloat) { RunMyApp<float>(argc, argv); } else {RunMyApp<double>(argc, argv); }-- 你考虑过吗? RunMyApp 是一个模板函数,基本上就是你的应用程序。如果你这样做了,void**就没有必要了。