Однострочный вызов std::optional::emplace, только если он не имеет значенияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Однострочный вызов std::optional::emplace, только если он не имеет значения

Сообщение Anonymous »

По аналогии с созданием экземпляра в std::map при вызове оператора[] я хотел бы разместить (прямо в выражении) в std::optional только в том случае, если has_value() имеет значение false. Другими словами, я хотел бы выделить этот код в одну строку:

Код: Выделить всё

std::vector data;
//...
if(condition)
{
if(!data[42].has_value()) data[42].emplace();
data[42].value()[3].push_back("foo");
}
Что-то вроде:

Код: Выделить всё

if(condition)
data[42].value_or_emplace()[3].push_back("foo");
Я знаю, что могу создать свой собственный инструмент, подобный этому:

Код: Выделить всё

template 
T& value_or_emplace(std::optional& o)
{
return (o.has_value() ? o.value() : o.emplace());
}

if(condition)
value_or_emplace(data[42])[3].push_back("foo");
Но я ожидаю чего-то, что я пропустил в стандартной библиотеке.

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-no-value
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»