将boost :: shared_array <void>转换为boost :: shared_array <int> </int> </void>

时间:2011-03-08 14:09:31

标签: 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;
    }
}

我希望能够做到这一点:

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;
}

但我无法正确投射。我需要做些什么来使这个声明有效?

2 个答案:

答案 0 :(得分:6)

您无法转换,因为shared_array<void>不知道如何删除指向void*数组的int指针。

你可以试试类似shared_array<void>(new int[rows*clmns], checked_array_deleter<int>())的东西,虽然我没有测试过它是对的。您可能需要将删除器包装为将参数转换为int*的内容。

或者,由于您的所有类型都是POD,因此您可以使用charshared_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());