2012-01-20 7 views
11

¿Alguien ha escrito una secuencia de comandos, un complemento o un archivo ejecutable que reemplaza cada instancia de 'auto' con el tipo deducido del compilador? Necesito portar un código C++ 11 que use el auto por todas partes.Reemplazar palabra clave automática con tipo deducido (clang o VS2010)

Clang es mi primer candidato. ¿Alguien lo ha modificado para hacer algo como esto?

Una alternativa es analizar los errores de un compilador ya que el tipo esperado podría estar en la salida del error. Podría -Dauto=int y posiblemente volver "could not convert std::vector<int>::iterator to 'int'"

+5

No es probable. Tendemos a portar el software a C++ 11, no a C++ 11. –

+0

Ni siquiera es posible, no dentro de las plantillas, donde el tipo depende de los parámetros de la plantilla. – sellibitze

+1

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

Respuesta

8

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

Cuestiones relacionadas