我有一些看起来像这样的遗留代码:
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;
}
但我无法正确投射。我需要做些什么来使这个声明有效?
答案 0 :(得分:6)
您无法转换,因为shared_array<void>
不知道如何删除指向void*
数组的int
指针。
你可以试试类似shared_array<void>(new int[rows*clmns], checked_array_deleter<int>())
的东西,虽然我没有测试过它是对的。您可能需要将删除器包装为将参数转换为int*
的内容。
或者,由于您的所有类型都是POD,因此您可以使用char
和shared_array<char>
的数组。然后就不需要指定删除器了。
void*
引用事物,或者无效智能指针,那么您忽略了C ++是一种静态类型的语言。您可以查看Boost.Variant,具体取决于您的数组的使用方式。
答案 1 :(得分:1)
它不能与shared_array一起使用,请使用shared_ptr。
boost::shared_ptr < void > getData(DataType dataType)
{
boost::shared_ptr < void > theData;
switch(dataType)
{
case TYPE_FLOAT:
theData = boost::shared_ptr<float>(new float[ rows * clms ],
boost::checked_array_deleter<float>());
break;
case TYPE_INT:
theData = boost::shared_ptr<int>(new int[ rows * clms ],
boost::checked_array_deleter<int>());
break;
case TYPE_DOUBLE:
theData = boost::shared_array<double>(new double[ rows * clms ],
boost::checked_array_deleter<double>());
break;
default:
break;
}
return theData; // I think will work
}
如果该返回不起作用,则会:
return boost::shared_ptr<void>(theData, theData.get());