Domanda

Stiamo programmando una libreria di registrazione che si mantiene in un file .hpp. Vorremmo includere <tr1/unordered_map> (se il compilatore supporta TR1,) o il <map> normale altrimenti. C'è un modo standard di controllo al momento della compilazione, se TR1 è disponibile o no?

Stavo pensando che lo stesso modo in cui il "__cplusplus" definire il simbolo è presente, non avrebbe potuto essere definito un "__cxx__tr1" o qualcosa di simile. Non ho visto che nelle bozze per TR1, quindi immagino che non è presente, ma ho voluto chiedere prima per ogni evenienza.

Come nota, se non esistono quei definisce, non sarebbe una cattiva idea di includerli nelle proposte stesse.

È stato utile?

Soluzione

Se si sta utilizzando qualsiasi strumento di configurazione come autotools si può tentare di scrivere un test come:

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

E poi usare queste definizioni nel codice.

In generale macro __cplusplus dovrebbe dare il numero di versione standard, ma non v'è alcun compilatore che ti dà il 100% implementazione standard ... Quindi scrivere configurare le macro.

Purtroppo questo è solo modo abbastanza affidabile per controllare queste cose a meno che non si desidera scrivere 1001 #ifdef per ogni compilatore (che cosa spinta fa)

E poi:

#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

Altri suggerimenti

GCC-4.3 è dotato di:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Ma, questo è, ovviamente, non standard.

Vedere ISO C ++ (WG21) carta N1575 . Questo documento è stato fatto cadere da TR1, con nessuna sostituzione. Quindi non v'è alcun modo ufficiale per rilevare TR1.

Una biblioteca mi occupo di ha bisogno di usare alcune classi che ha ottenuto aggiunti a TR1 da Boost, preferendo TR1 se disponibile. La soluzione (essendo una libreria Unix-based) è quello di spingere i controlli nel script di configurazione.

Quindi, in altre parole, no, niente portatile che io sappia. Detto questo, se siete su Unix, i controlli di script di configurazione funzionano abbastanza bene.

Supponendo che si sta usando VS2010, o qualsiasi suite che ha TR1 disponibili, che cosa accadrebbe se si dovesse fare

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

Quale sarebbe il tipo di uMap essere?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top