valores valor una retornar retornan que puede mas lista funciones funcion devuelve devolver como arreglo array c++ c++11 return-value optional

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:

  1. 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
  2. Emparejándolo con un bool

    std::pair<double,bool> possiblyFailingCalculation();

  3. Viejo estilo

    bool possiblyFailingCalculation(double& output);

    • (-) incompatible con el nuevo auto value = calculation() C ++ 11 auto value = calculation() estilo
  4. 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?

  5. 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.