una todas llamar las funciones funcion estructura ejemplos declara como c++ function c++17 return-type compile-time

todas - funciones en c++ ejemplos



La forma más sencilla de determinar el tipo de retorno de la función (3)

Dada una función muy simple, pero larga, como:

int foo(int a, int b, int c, int d) { return 1; } // using ReturnTypeOfFoo = ???

¿Cuál es la forma más sencilla y concisa de determinar el tipo de retorno de la función ( ReturnTypeOfFoo , en este ejemplo: int ) en el momento de la compilación sin repetir los tipos de parámetros de la función (solo por su nombre, ya que se sabe que la función no tiene sobrecargas adicionales) )?


Lo más simple y conciso es probablemente:

template <typename R, typename... Args> R return_type_of(R(*)(Args...)); using ReturnTypeOfFoo = decltype(return_type_of(foo));

Tenga en cuenta que esto no funcionará para objetos de función o punteros a funciones miembro. Solo funciones, que no están sobrecargadas o plantillas, o noexcept .

Pero esto puede extenderse para admitir todos esos casos, si así lo desea, agregando más sobrecargas de return_type_of .


No sé si es la forma más sencilla (si puede usar C ++ 17 seguramente no lo es: vea la respuesta de NathanOliver) pero ... ¿qué hay de declarar una función de la siguiente manera?

template <typename R, typename ... Args> R getRetType (R(*)(Args...));

y usando decltype() ?

using ReturnTypeOfFoo = decltype( getRetType(&foo) );

Observe que getRetType() solo se declara y no se define porque se llama solo decltype() , por lo que solo el tipo devuelto es relevante.


Puede aprovechar std::function aquí, lo que le dará un typedef para el tipo de devolución de funciones. Esto requiere el soporte de C ++ 17, ya que se basa en la deducción de argumentos de la plantilla de clase , pero funcionará con cualquier tipo llamable:

using ReturnTypeOfFoo = decltype(std::function{foo})::result_type;

Podemos hacer esto un poco más genérico como

template<typename Callable> using return_type_of_t = typename decltype(std::function{std::declval<Callable>()})::result_type;

que luego te permite usarlo como

int foo(int a, int b, int c, int d) { return 1; } auto bar = [](){ return 1; }; struct baz_ { double operator()(){ return 0; } } baz; using ReturnTypeOfFoo = return_type_of_t<decltype(foo)>; using ReturnTypeOfBar = return_type_of_t<decltype(bar)>; using ReturnTypeOfBaz = return_type_of_t<decltype(baz)>;