Кастинг Boost :: shared_array <void>для повышения :: shared_array <int> - PullRequest
2 голосов
/ 08 марта 2011

У меня есть какой-то устаревший код, который выглядит следующим образом:

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 ]

6 голосов
/ 08 марта 2011

Вы не можете просто конвертировать, потому что 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 голос
/ 08 марта 2011

Это не будет работать с 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());
...