Lamentablemente, esto es imposible en el caso general. Considere:
template <typename T> void foo(T & t)
{
auto it = t.find(42);
...
}
...
std::map<int, int> m;
std::set<int> s;
...
foo(m);
foo(s);
cierto sentido un ejemplo, pero muestra que no hay manera de saber con qué reemplazar automático con, cuando depende de un parámetro de plantilla. std::map
y std::set
, incidentalmente, contienen typedefs del mismo nombre (iterator
) que representan el tipo del iterador respectivo, por lo que typename T::iterator it
funcionaría aquí, pero puede instanciar foo
para un T
que no tenga dicho typedef. se añadieron
Los numerosos typedefs en las clases de la biblioteca estándar exactamente para permitir este tipo de plantillas para ser escritos antes auto
fue inventado/re-utilizados, y se puede hacer lo mismo para hacer frente a un compilador que no tiene auto
. Pero no es algo que se puede automatizar, al menos no sin un esfuerzo comparable al añadir soporte para auto
a un compilador ...
Incluso cuando auto
no depende de un tipo de plantilla, es un problema difícil para reemplazarlo con algo que tiene sentido para el usuario y es portátil. Tome:
std::map<int, int> m;
auto it = m.find(42);
La sustitución razonable para auto
es std::map<int, int>::iterator
, pero si se utiliza -Dauto=int
y mirar a los mensajes de error del compilador, que había reemplazarlo con algo como std::_Rb_tree_iterator<std::pair<const int, int> >
. Ése es el detalle de implementación de la biblioteca estándar, difícil de leer y obviamente no portátil: no desea que en su código.
En el mismo ejemplo, mi compilador (GCC 4.4.6) dice:
error: cannot convert __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
to int
in initialization
No es probable. Tendemos a portar el software a C++ 11, no a C++ 11. –
Ni siquiera es posible, no dentro de las plantillas, donde el tipo depende de los parámetros de la plantilla. – sellibitze
Pero, hasta donde yo sé, VisualStudio es lo suficientemente inteligente como para indicarle el tipo si coloca el mouse sobre la variable, a menos que dependa de los parámetros de la plantilla, por supuesto. – sellibitze