Освободить и преобразовать данные из unique_ptr в другой без копирования

#c #unique-ptr

#c #уникальный-ptr

Вопрос:

У меня есть unique_ptr массива с плавающей точкой, который я хотел бы изменить на unique_ptr массива uint8_t в моей функции. Другими словами, unique_ptr<float[]> —> unique_ptr<uint8_t[]> .

Это то, что я пробовал

 void my_function(std::unique_ptr<float*> data) {
    std::unique_ptr<uint8_t*> converted_data(reinterpret_cast<uint8_t*>(data.release()));

    // ...
    // Processing converted_data ...
}
  

Поскольку я получаю эту ошибку: no matching constructor for initialization of 'std::unique_ptr<uint8_t *>' , мне было интересно, возможно ли достичь этой цели без копирования данных.

Комментарии:

1. «У меня есть unique_ptr массива с плавающей точкой, который я хотел бы изменить на unique_ptr массива uint8_t» — звучит как действительно плохая идея. Почему вы думаете, что хотите / нуждаетесь в этом? Вероятно, есть способ получше.

2. std::unique_ptr<float*> должно быть unique_ptr<float[]>

3. Это странно. Основная проблема заключается в том, что data.release() возвращает float** (обратите внимание на две звезды!) и, хотя reinterpret_cast это нарушит множество правил, этого не произойдет. Если вы измените его на приведение к uint8_t** , он компилируется. Но это все еще опасно и, вероятно, не делает то, что вы хотите.

Ответ №1:

Вы приводите к несовместимому типу.

data.release() имеет тип float**, поскольку он возвращает необработанный указатель на то, что было в unique_ptr (в данном случае float*). Вместо этого вы должны преобразовать в uint_8t ** (хотя это все еще выглядит как плохая идея).