в лист и главное - как его оттуда извлечь?
Вот я пытаюсь заполнить структуру данными и пихнуть указатель в лист:
std::unique_ptr<app_message> msg = std::make_unique<app_message>();
msg->size = message.size;
memcpy(msg->data, message.data, message.size);
msg->device_type = message.device_type;
msg->sourse_handle = message.sourse_handle;
app_list.push_back(std::move(msg)); //move for r-value ?:(
Эта часть хотя бы компилируется.
А вот пытаюсь извлечь указатель и тут беда:
auto &msg = app_list.front();
auto new_ptr = msg;
app_list.pop_front();
return msg;
Суть простая, хочу сделать из std::list очередь - в одном месте кладем соощения, в другом забираем - но я не понимаю почему в стандартных контейнерах нет такой простой опереации - pop удаляет элемент но не копирует его (как я понял из доков), а как сначала скопировать из очереди умный указатель и так чтобы он получил право владения ресурсом при этом?
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
emplace_back вам нужен
видел эту функцию, но она очень похожа на void push_back(Type&& val) по смыслу. есть разница? в примерах же через push кладут цифры - т.е. r-value. или есть разница?
Разница в том, что emplace на месте элемент конструирует, а push - сначала создаёт элемент в контейнере, а затем присваивает ему переданное значение
emplace_back сразу в лист запихнет unique_ptr без копирований всяких
К слову, std::list не самый лучший вариант для очереди. Да и в принципе его лучше без особой на то надобности не трогать Есть std::queue поверх дека для очереди
я и queue попробовал - но у них очень похожий api - и я в обоих случаях не понимаю как мне извлечь умный указатель обратно из контейнера. )))
Обсуждают сегодня