Con el lanzamiento de GCC 4.8.0, tenemos un compilador que admite la deducción automática del tipo de devolución, parte de C ++ 14. Con -std=c++1y
, puedo hacer esto:
auto foo() { //deduced to be int
return 5;
}
Mi pregunta es: ¿Cuándo debo usar esta función? ¿Cuándo es necesario y cuándo hace que el código sea más limpio?
escenario 1
El primer escenario en el que puedo pensar es siempre que sea posible. Todas las funciones que se pueden escribir de esta manera deberían serlo. El problema con esto es que no siempre puede hacer que el código sea más legible.
Escenario 2
El siguiente escenario es evitar tipos de retorno más complejos. Como un ejemplo muy ligero:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
No creo que eso realmente sea un problema, aunque supongo que tener el tipo de retorno depende explícitamente de los parámetros podría ser más claro en algunos casos.
Escenario 3
A continuación, para evitar la redundancia:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
En C ++ 11, a veces podemos simplemente return {5, 6, 7};
reemplazar un vector, pero eso no siempre funciona y necesitamos especificar el tipo en el encabezado y el cuerpo de la función. Esto es puramente redundante, y la deducción automática del tipo de devolución nos salva de esa redundancia.
Escenario 4
Finalmente, se puede usar en lugar de funciones muy simples:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Sin embargo, a veces, podemos mirar la función, queriendo saber el tipo exacto, y si no se proporciona allí, tenemos que ir a otro punto en el código, como donde pos_
se declara.
Conclusión
Con esos escenarios establecidos, ¿cuál de ellos demuestra ser una situación en la que esta característica es útil para hacer que el código sea más limpio? ¿Qué pasa con los escenarios que he olvidado mencionar aquí? ¿Qué precauciones debo tomar antes de usar esta función para que no me muerda más tarde? ¿Hay algo nuevo que esta característica trae a la mesa que no sea posible sin ella?
Tenga en cuenta que las múltiples preguntas están destinadas a ayudar a encontrar perspectivas desde las cuales responder esto.
->decltype(t+u)
con deducción automática mata a SFINAE.