Joh*_*ohn 2 c++ boost casting smart-pointers
我有一些看起来像这样的遗留代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够这样做:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是我不能正确地进行投射.要使此声明有效,我需要做什么?
你不能只是转换,因为shared_array<void>不知道如何删除void*指向数组的指针int.
你可以尝试类似的东西shared_array<void>(new int[rows*clmns], checked_array_deleter<int>()),虽然我还没有测试过它是对的.您可能需要将删除器包装为将参数转换为的内容int*.
或者,由于你的所有类型都是POD,你可以使用chara和a 的数组shared_array<char>.然后就不需要指定删除器了.
顺便说一句,在这里插入通常抱怨这是一个狡猾的设计.如果您指的是void*智能指针,或者无效智能指针,那么您忽略了C++是一种静态类型的语言.您可以查看Boost.Variant,具体取决于您的数组的使用方式.
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |