Pregunta

Estamos programando una biblioteca de registro que mantiene a sí mismo en un archivo .hpp. Nos gustaría incluir <tr1/unordered_map> (si el compilador soporta TR1,) o la norma <map> lo contrario. ¿Hay una manera estándar de comprobación en tiempo de compilación si TR1 está disponible o no?

Estaba pensando que de la misma manera que el "__cplusplus" definir símbolo está presente, no se podría haber definido un "__cxx__tr1" o algo por el estilo. No he visto que en los borradores para TR1, así que supongo que no está presente, pero quería preguntar primero si acaso.

Como nota, si no existen esos define, no sería una mala idea para incluirlos en las propuestas de sí mismos.

¿Fue útil?

Solución

Si está utilizando cualquier herramienta de configuración como autotools es posible que trate de escribir una prueba como:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

Y a continuación, utilizar estos define en el código.

En términos generales macro __cplusplus que debe dar el número de versión estándar, pero no hay un compilador que le da el 100% implementación estándar ... Por lo tanto escribir configurar macros.

Por desgracia, esta es única manera bastante fiable para comprobar este tipo de cosas a menos que desee escribir 1001 #ifdef para cada compilador (lo que lo hace impulso)

Y a continuación:

#include "config.h"
#ifdef  HAVE_CXX0X
#  include <unordered_map>
   typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
#  include <tr1/unordered_map>
   typedef std::tr1::unordered_map<foo,bar> my_map;
#else
#  include <map>
   typedef std::map<foo,bar> my_map;
#endif

Otros consejos

GCC-4.3 tiene:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Pero, esto es, obviamente, no estándar.

Véase ISO C ++ (WG21) papel N1575 . Este documento ha sido eliminado de TR1, sin reemplazo. Así que no hay manera oficial para detectar TR1.

Una biblioteca de trato con las necesidades de utilizar algunas clases que quedó agregan a TR1 de Boost, prefiriendo TR1 si está disponible. La solución (siendo una biblioteca basada en Unix) es de empujar los controles en el script de configuración.

En otras palabras, no, nada portátil que yo sepa. Dicho esto, si estás en UNIX, el script comprueba configuran el trabajo lo suficientemente bien.

Suponiendo que uno está usando VS2010, o cualquier suite que tiene TR1 disponibles, lo que ocurriría si uno fuera a hacer

#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;

¿Cuál sería el tipo de uMap ser?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top