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:
Si cambio el nombre de la función, debo cambiar
decltype (prueba ())
dentro
decltype (nombre ())
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 :)