Tipo de retorno basado en el valor del parámetro de entrada

En C ++ 11, ¿hay una manera de implementar una función sqrt que funcione para valores de entrada double positivos y negativos? Me gustaría que el tipo de retorno sea std::complex si la entrada es negativa y un double si es positiva. Me doy cuenta de que la solución simple es devolver siempre std::complex pero esto no es lo que estoy buscando.

A continuación, tengo un ejemplo de mi primer bash, sin embargo, esto no se comstack debido a la presencia de a en el tipo de retorno:

 inline decltype((a > 0)?(double):(std::complex)) sqrt(const double& a) { if(a > 0) { return std::sqrt(a); } else { return ((std::complex(0.0,1.0))*std::sqrt(-a)); } } 

No, esto no es posible.

Los tipos son construcciones en tiempo de comstackción, y el tipo de su función es fijo en tiempo de comstackción.

Si el argumento se proporcionara como una “expresión constante” constexpr , es posible que haya utilizado plantillas para resolver su problema. Pero, con entradas dinámicas, esto simplemente no es posible.

Podría devolver un boost::variant> (ya que la decisión debe tomarse en el tiempo de ejecución), pero eso parece agregar mucha complejidad a su código sin ganancia real.

No es posible, y probablemente lo más importante, probablemente no sería útil incluso si pudieras hacerlo.

Dado que la función puede devolver un número complejo, el código de llamada debe estar preparado para procesar un número complejo. Si su código necesita poder procesar números complejos en cualquier caso, es casi seguro que tenga más sentido devolver siempre un número complejo, y si la entrada fue positiva, tendrá la forma X + 0i (es decir, la parte imaginaria). será igual a 0).

En teoría, podría hacer esto en un lenguaje que admitiera la escritura dinámica, pero incluso con la mayoría de ellos, sqrt se escribe básicamente estáticamente. Si la entrada que proporciona es un número real, el resultado también será un número real, y si la entrada fue negativa, el resultado será normalmente un NaN o algo en ese orden. Si (y solo si) proporciona la entrada como un número complejo, recibirá un número complejo como resultado.