Frage

Wir programmieren eine Logging-Bibliothek, die sich in einer .hpp-Datei hält. Wir möchten <tr1/unordered_map> enthalten (wenn der Compiler TR1 unterstützt) oder der Standard-<map> anders. Gibt es eine Standardmethode bei der Kompilierung zu überprüfen, ob TR1 vorhanden ist oder nicht?

Ich dachte, dass die gleiche Art und Weise, dass die „__cplusplus“ definiert Symbol vorhanden ist, es hätte ein „__cxx__tr1“ oder so ähnlich definiert. Ich habe das nicht für TR1 in den Entwürfen zu sehen ist, so nehme ich es nicht vorhanden ist, aber ich wollte zuerst fragen nur für den Fall.

Als Hinweis, wenn diese definiert nicht existieren, es wäre keine schlechte Idee sein, sie sich in Vorschlägen aufzunehmen.

War es hilfreich?

Lösung

Wenn Sie Konfigurations-Tools wie Autotools verwenden können Sie versuchen, einen Test wie zu schreiben:

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

Und dann diese definiert in Ihrem Code verwenden.

Generell __cplusplus Makro sollten Sie Standard-Versionsnummer geben, aber es gibt keinen Compiler, dass Sie 100% Standard-Implementierung gibt ... schreiben So Makros konfigurieren.

Leider ist diese nur recht zuverlässig Weg ist, solche Dinge zu überprüfen, wenn Sie 1001 #ifdef für jeden Compiler schreiben wollen (was boost der Fall ist)

Und dann:

#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

Andere Tipps

GCC-4.3 hat:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Aber das ist natürlich nicht Standard.

Siehe ISO C ++ (WG21) Papier N1575 . Dieses Papier wurde von TR1, ohne Ersatz fallen gelassen. Also gibt es keinen offiziellen Weg TR1 zu erkennen.

Eine Bibliothek, die ich mit Bedürfnisse beschäftigen einige Klassen zu verwenden, die von Boost, lieber TR1 TR1 hinzugefügt wurde, falls verfügbar. Die Lösung (die eine Unix-basierte Bibliothek) ist es, die Kontrollen in den Configure-Skript zu schieben.

Also mit anderen Worten, nein, nichts tragbar, die ich kenne. Das heißt, wenn Sie auf Unix sind, die Configure-Skript überprüft gut genug, um zu arbeiten.

Unter der Annahme einer VS2010 verwendet, oder eine Suite, die TR1 zur Verfügung hat, was passieren würde, wenn man täte

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

Was die Art des uMap sein würde?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top