Pregunta ¿Hay alguna forma de obtener el tipo de devolución de la "función actual"?


Me gustaría escribir una plantilla que obtenga como parámetro el tipo de devolución de la función en la que se está instanciando.

Por ejemplo, supongamos que tengo un Result clase modelada:

template<type T>
class Result {
    T _result_value;
    T& operator=( T that );
    ~Result( );
}

Habría varias especializaciones para esta clase. En el destructor me gustaría registrar el tipo de devolución, y dentro del operator= asignación Me gustaría verificar y afirmar los valores de error.

Idealmente, me gustaría poder tener esa definición:

#define RESULT Result< /* decltype magic for type of current function */ >

para poder usarlo

HFILE MyOpenFile( ... ) {
    RESULT result;
}

... que se deducirá a Result<HFILE>. Este es un ejemplo simplificado: escribir RESULT en lugar de Result<HFILE> no es un gran problema, pero hay otros escenarios donde el tipo de retorno de la función actual no se obtiene fácilmente.


11
2017-11-08 09:56


origen


Respuestas:


No. No hay nada en C ++ que se refiera a la "función actual". Lo más cercano es __func__ pero eso es un literal de cadena. Por lo tanto, no hay nada a lo que pasar decltype.

No es que lo necesites, con auto.


4
2017-11-08 10:41



No es posible desde dentro de una función porque no hay un objeto dedicado en la memoria que lo represente, al que se puede hacer referencia para deducir el tipo. Es posible para las clases, a través de decltype(*this).


3
2017-11-08 10:40



La forma más portátil que puedo pensar es usar decltype:

#define RESULT(func, ...) Result<decltype(func(__VA_ARGS__))>

int main(int argc, char **argv) {
    RESULT(main, argc, argv) result; // same as `Result<int> result;`
}

Pero esto te obliga a pasar el nombre de la función y cada argumento que lleva al RESULT macro. No creo que esto se pueda evitar, porque no existe una forma portátil (y muchas veces ni siquiera específica del compilador) de obtener un identificador para la función actual y / o argumentos aprobados. Los argumentos pasaron a la materia gracias a las ambigüedades de sobrecarga.

Aquí hay un SSCCE: http://ideone.com/cPTjjF


3
2017-11-08 10:42