Question

Nous programmons une bibliothèque d'exploitation forestière qui se conserve dans un fichier .hpp. Nous aimerions inclure <tr1/unordered_map> (si le compilateur prend en charge TR1,) ou la norme <map> autrement. Est-il un moyen standard de vérifier au moment de la compilation si TR1 est disponible ou non?

Je pensais que la même manière que le « __cplusplus » définir le symbole est présent, il aurait pu être défini un « __cxx__tr1 » ou quelque chose comme ça. Je ne l'ai pas vu que, dans les courants d'air pour TR1, donc je suppose que ce n'est pas présent, mais je voulais demander d'abord au cas où.

Comme une note, si ces définit n'existent pas, ce ne serait pas une mauvaise idée de les inclure dans les propositions elles-mêmes.

Était-ce utile?

La solution

Si vous utilisez des outils de configuration comme autotools vous pouvez essayer d'écrire un test comme:

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

Et puis utilisez ces définit dans votre code.

D'une manière générale macro __cplusplus devrait vous donner le numéro de version standard, mais il n'y a pas compilateur que vous donne la mise en œuvre standard de 100% ... Ainsi écrire des macros configurer.

Malheureusement, c'est seul moyen assez fiable pour vérifier ces choses, sauf si vous voulez écrire 1001 #ifdef pour chaque compilateur (ce boost fait)

Et puis:

#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

Autres conseils

GCC-4.3 a:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Mais, cela est évidemment pas standard.

Voir ISO C ++ (WG21) N1575 . Ce document a été passé de TR1, sans remplacement. Donc, il n'y a aucun moyen officiel pour détecter TR1.

Une bibliothèque, je répondre à des besoins d'utiliser des classes qui se est ajouté à TR1 de Boost, préférant TR1 le cas échéant. La solution (étant une bibliothèque basée sur Unix) est de pousser les contrôles dans le script de configuration.

En d'autres termes, non, portable rien que je sache. Cela dit, si vous êtes sous Unix, les contrôles de script de configuration fonctionnent assez bien.

En supposant l'on utilise VS2010, ou une suite qui a TR1 disponible, ce qui se passerait si l'on à faire

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

Quel serait le type de uMap être?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top