c++ c++11 types decltype type-deduction

auto c++



C++ decltype deducir la funciĆ³n actual devuelta tipo (5)

Me gustaría deducir automáticamente el tipo devuelto de la función que estoy escribiendo. Ejemplo:

std::vector<int> test(){ decltype(this_function) ret; ret.push_back(5); ret.push_back(9); return ret; }

Hasta ahora, lo mejor que he logrado es

std::vector<int> test(){ decltype(test()) ret; ret.push_back(5); ret.push_back(9); return ret; }

Que funciona pero:

  1. Si cambio el nombre de la función, debo cambiar

    decltype (prueba ())

    dentro

    decltype (nombre ())

  2. Si cambio los parámetros de la función, debo cambiar también

    decltype (prueba ())

    dentro

    decltype (prueba (param1, param2))

¿Hay una forma más elegante de hacer lo mismo?


Esto puede parecer extraño, pero creo que hace lo que quieres que haga.

std::vector<int> create() { std::vector<int> x; return x; } auto myfunc() -> decltype(create()) { auto X = create(); return X; }


La pregunta es paradoja:

En este ejemplo

std::vector<int> test(){ decltype(test()) ret; ret.push_back(5); ret.push_back(9); return ret; }

la función tiene que suponer que el tipo de decltype es un contenedor que admite push_back con un tipo de valor de int. No hay forma de predecirlo. Simplemente cambiando el tipo de devolución (al doble) se romperá.


Nombre el tipo de devolución?

template <typename T=std::vector<int>> T test(){ T ret; ret.push_back(5); ret.push_back(9); return ret; }

Por favor, no me hagas restringir esto con enable_if .


Pre-C ++ 1y (y post-C ++ 1y, también), podría usar una lambda para hacer la deducción del tipo de devolución por usted, como en:

namespace { auto test = [] { std::vector<int> ret; ret.push_back(5); ret.push_back(9); return ret; }; }


Qué tal si :

typedef std::vector<int> my_return_type; my_return_type test(){ my_return_type ret; ret.push_back(5); ret.push_back(9); return ret; }

Creo que no tendrás nada mejor sin las macros :)