Очевидно, что std::optional
- лучший выбор для возврата необязательного значения из функции, если использовать С++ 17 или boost (см. также GOTW # 90)
std::optional<double> possiblyFailingCalculation()
Но что и почему будет лучшей альтернативой, если вы застряли с более старой версией (и не можете использовать boost)?
Я вижу несколько вариантов:
-
умные указатели STL (только для С++ 11)
std::unique_ptr<double> possiblyFailingCalculation();
- (+) практически такое же использование, как опция
- (& minus;) сбивает с толку интеллектуальные указатели на неполиморфные типы или встроенные типы
-
Сопряжение с помощью bool
std::pair<double,bool> possiblyFailingCalculation();
-
Старый стиль
bool possiblyFailingCalculation(double& output);
- (& минус;), несовместимый с новым стилем С++ 11
auto value = calculation()
- (& минус;), несовместимый с новым стилем С++ 11
-
Шаблон DIY: базовый шаблон с одинаковой функциональностью достаточно прост для кодирования, но есть ли какие-либо проблемы для реализации надежного шаблона типа
std::optional<T>
? -
Выбросить исключение
- (& minus;) Иногда "невозможно вычислить" является допустимым возвращаемым значением.