с юник-поинтерами на базовый класс:
inline const Container Elements = {
std::make_unique<Derived1>(),
...
};
Требуется вернуть ссылку на элемент этого контейнера из функции примерно так:
[[nodiscard]] const std::unique_ptr<Base>& Get(...)
{
for (const auto& e : Elements) {
if (e.IsAwesome(...)) return e;
}
// TODO
}
Вот на месте TODO надо вернуть что-то, что покажет, что нужного элемента нет.
Исключение бросать не хочется.
Думал взять std::optional, но ссылки это не Destructible тип :(
Может есть какой-то общепринятый способ показать, что ничего хорошего не вернулось?
Возвращать мувнутое значение или nullptr не катит - в контейнере всё должно остаться на месте.
На шаред-поинтер переходить только? Или я какого-то очевидного решения не вижу?
static const std::unique_ptr<Base> empty; return empty;
Ну да, очевидное решение😅 Спасибо!
Но я бы подумал о переходе на const Base* в качестве возвращаемого значения с семантикой опциональной ссылки
Верни дефолтно сконструированный unique_ptr
Тогда ты правильно написал
Георгий, не надо возвращать unique-ptr по ссылке, надо либо без unique, либо по значению. По ссылке возвращать нет смысла.
Да в итоге голый невладеющий указатель возвращаю или nullptr На тот момент оно просто красиво не вписывалось в окружающий код, но он в итоге изменился. Стало и красиво и несложно
Обсуждают сегодня