una - ¿Mejor alternativa a std:: opcional para devolver un valor opcional desde un método?(utilizando C++ 98/C++ 11/C++ 14)
retornar una lista en c++ (2)
Obviamente, std::optional
es la mejor opción para devolver un valor opcional de una función si uno usa C ++ 17 o boost (vea también GOTW # 90 )
std::optional<double> possiblyFailingCalculation()
Pero, ¿cuál y por qué sería la mejor alternativa si uno se atasca con una versión anterior (y no puede usar boost)?
Veo algunas opciones:
Punteros inteligentes STL (solo C ++ 11)
std::unique_ptr<double> possiblyFailingCalculation();
- (+) prácticamente el mismo uso que opcional
- (-) confuso tener punteros inteligentes para tipos no polimórficos o tipos incorporados
Emparejándolo con un bool
std::pair<double,bool> possiblyFailingCalculation();
Viejo estilo
bool possiblyFailingCalculation(double& output);
- (-) incompatible con el nuevo
auto value = calculation()
C ++ 11auto value = calculation()
estilo
- (-) incompatible con el nuevo
Una plantilla de bricolaje : una plantilla básica con la misma funcionalidad es lo suficientemente fácil de codificar, pero ¿hay algún inconveniente para implementar una plantilla
std::optional<T>
aspecto similar?Lanzar una excepción
- (-) A veces, "imposible de calcular" es un valor de retorno válido.
Devuelve una estructura (o una clase si quieres operadores de fundición portátiles)
std::optional
, como su boost::optional
padre boost::optional
, es una plantilla de clase bastante básica. Es un bool
, algo de almacenamiento y un montón de funciones de miembro de conveniencia, la mayoría de las cuales son una línea de código y una afirmación.
La opción de bricolaje definitivamente se prefiere. (1) implica asignación y (2), (3) implica tener que construir una T
incluso si desea un valor nulo, lo que no importa en absoluto para el double
pero sí lo es para los tipos más caros. Con (5), las excepciones no son un reemplazo para optional
.
Siempre puedes comparar tu implementación con la de Boost. Es una pequeña biblioteca de sólo encabezado, después de todo.