es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el tipo de retorno de la función actual en C++

Esta pregunta es similar a https://stackoverflow.com/questions/8666735/get-return-type-of-function-in-macro-c, pero tiene 10 años y no tiene respuesta. Cualquier otra solución sería aceptada.

Quiero crear una macro assert que solo regrese de la función si no se cumple la condición, como:

#define ASSERT(X) if(!(X)) return {};

Esto no funciona si la función contenedora devuelve void, pero no quiero crear 2 macros. Quiero poder agregar/quitar valores de retorno sin cambiar el código. Mi idea es crear una función auxiliar:

template
T re(){
if constexpr( std::is_same<t, void=””>::value ){
return;
}
else if constexpr( ! std::is_same<t, void=””>::value ){
return {};
}
}

Ahora la macro podría funcionar así:

double f(int *i){
if(i == nullptr){
typedef std::invoke_result<decltype(&f),int>::type T; // solo funciona para esta función
return re();
}
return 1.0;
}

Pero necesito el tipo de retorno T de la función actual sin tener que llamar algo como ASSERT(i != nullptr, double) porque entonces simplemente podría usar 2 macros. Además, las macros como __func y std::source_location son solo cadenas.</decltype(&f),int></t,></t,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el tipo de retorno de la función actual sin utilizar una macro separada, se puede hacer uso de decltype(auto). La macro modificada se vería así:

    #define ASSERT(X) if(!(X)) return decltype(auto){};
    

    De esta manera, la macro funcionará tanto para funciones que devuelven void como para aquellas que devuelven tipos no void sin necesidad de una función auxiliar separada. El tipo de retorno se deduce utilizando la sintaxis decltype(auto), lo que permite manejar de manera flexible los tipos de retorno dentro de la propia macro.

Comments are closed.