我有一些遗留代码,如下所示:
void* getData(DataType dataType)
{
switch(dataType)
{
case TYPE_FLOAT:
return new float[ rows * clms ];
case TYPE_INT:
return new int[ rows * clms ];
case TYPE_DOUBLE:
return new double[ rows * clms ];
default:
return NULL;
}
}
我希望能够做到这一点:
boost::shared_array < void > getData(DataType dataType)
{
boost::shared_array < void > theData;
switch(dataType)
{
case TYPE_FLOAT:
theData = boost::shared_array<float>(new float[ rows * clms ]);
break;
case TYPE_INT:
theData = boost::shared_array<int>(new int[ rows * clms ]);
break;
case TYPE_DOUBLE:
theData = boost::shared_array<double>(new double[ rows * clms ]);
break;
default:
break;
}
return theData;
}
但我无法正确选择类型转换。我需要做什么才能使此声明生效?
最佳答案
你不能只是转换,因为shared_array<void>
不知道如何删除 void*
指向 int
数组的指针.
你可以尝试像 shared_array<void>(new int[rows*clmns], checked_array_deleter<int>())
这样的东西,虽然我没有测试过它是否正确。您可能需要将删除器包装在将参数转换为 int*
的东西中.
或者,由于您所有的类型都是 POD,因此您可以使用 char
的数组和一个 shared_array<char>
.则无需指定删除器。
顺便说一句,在这里插入通常提示这是一个狡猾的设计。如果你指的是 void*
的东西, 或 void 智能指针,那么你忽略 C++ 是一种静态类型语言是有原因的。您可能会查看 Boost.Variant,具体取决于数组的使用方式。
关于c++ - 将 boost::shared_array<void> 转换为 boost::shared_array<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233568/