Obviously, std::optional is the best choice to return an optional value from a function if one uses C++17 or boost (see also GOTW #90)
std::optional<double> possiblyFailingCalculation()
But what and why would be the best alternative if one is stuck with an older version (and can't use boost)?
I see a few options:
STL smart pointers (C++11 only)
std::unique_ptr<double> possiblyFailingCalculation();- (+) virtually the same usage as optional
- (−) confusing to have smart pointers to non-polymorphic types or built-in types
Pairing it up with a bool
std::pair<double,bool> possiblyFailingCalculation();Old style
bool possiblyFailingCalculation(double& output);- (−) incompatible with new C++11
auto value = calculation()style
- (−) incompatible with new C++11
A DIY template: a basic template with the same functionality is easy enough to code, but are there any pitfalls to implement a robust
std::optional<T>look-a-like template ?Throw an exception
- (−) Sometimes "impossible to calculate" is a valid return value.