将boost :: shared_array <void>强制转换为boost :: shared_array <int>

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)

但是我不能正确地进行投射.要使此声明有效,我需要做什么?

Ste*_*sop 6

你不能只是转换,因为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,具体取决于您的数组的使用方式.