2015-03-29 3 views
1

Я использовал экспериментальное приложение std::optional какое-то время, и мне было интересно, когда-либо рассматривался такой метод, как std::optional<T>::value_or_default. Это даст вам значение, если включено, или по умолчанию T, если нет. Да, легко написать std::optional::value_or(T { }), но иногда, если T имеет кучу символов, я не думаю, что это так же ясно, как писать value_or_default.std :: optional :: value_or_default и std :: optional :: is_engaged

Также такие документы, как n3672, действительно не дают веской причины, почему такой метод, как std:optional::is_engaged, не был включен. Я понимаю, почему nullopt полезен в некоторых случаях и был включен, но я думаю, что std::optional::is_engaged понятнее в простых выражениях.

+0

«Усиление: необязательно» есть? –

+0

Кроме того, тестирование того, является ли опциональное, содержит значение, легко выполняется с использованием контекстного преобразования в 'bool', нет необходимости в' is_engaged' (и зачем использовать этот термин? В документации отсутствует нигде. Параллельные типы данных в других рамках используют " имеет значение ".) –

+0

' value_or_emplace' выглядит менее особым случаем, чем '_or_default'. Я утверждаю, что 'value_or' должен быть периодом' value_or_emplace' (только при необходимости создавайте 'или'). И 'value_or()' будет оператором, который вы хотите. – Yakk

ответ

1

Вот (минимально тестировался) реализация для вас:

template <typename T> 
T value_or_default (const std::experimental::optional<T> &s) 
{ return s.value_or(T{}); } 

Палка, что в программном коде, и вы сделали.

Смежные вопросы