Zwischen C ++ 0x, C ++ 03 TR1 und boost können einige Dinge wie function und bind je nach Compiler an 3 verschiedenen Stellen definiert werden, zB für VC vor VC9 Feature Pack haben Sie die Boost-Versionen, dann bekommen Sie Sie befinden sich jedoch im Namespace std :: tr1 :: und VC10 verschiebt das in den Namespace std ::.
Momentan benutzt mein existierender Code die Boost-Versionen im Boost :: Namespace exklusiv, aber für viele meiner Anwendungen und Libraries sind alle Boost-Sachen, die ich benutzt habe, nun in tr1 und C ++ 0x, id wie möglich entfernt die Boost-Abhängigkeit von diesen, während Rückwärtskompatibilität mit älteren Compiler-Versionen beibehalten wird.
Ich bin mir jedoch nicht sicher, wie ich meinen Code lokalisieren, einbinden und dann auf die richtigen Versionen zugreifen kann :( Eine Sache, die ich in Betracht gezogen habe, ist die Verwendung von Makros wie _MSC_VER, um festzustellen, ob der Compiler die gewünschten Klassen enthält. (zurück zu tr1 und dann nach Bedarf booten) und dann den "using somenamespace :: someclass;" - Kram verwenden, um die fraglichen Klassen in den std :: -Namespace zu verschieben.
Das Problem ist, dass es in einigen Fällen dazu führen kann, dass das Material kaputt geht, und ich bin mir nicht sicher, ob VC9 sein Feature Pack oder SP1 installiert hat oder nicht :( Ich bin mir auch nicht sicher um es zu tun, stelle vielleicht meine eigene Funktional.hpp zur Verfügung, die die erforderliche "Magie" macht?
Hauptsache, ich möchte damit beginnen, meinen Code für die neuen Standards zu schreiben, aber so, dass er auch mit älteren Compilern immer noch funktioniert.
Boost . TR1 tut dies bereits für Sie - es hat Compiler / Versionserkennungslogik, um die TR1-Implementierung Ihres Compilers zu verwenden, wenn es für Ihre Plattform verfügbar ist, oder verwenden Sie die verschiedenen relevanten Boost-Bibliotheken, um TR1 zu emulieren, falls nicht:
Diese Bibliothek implementiert nicht selbst die TR1-Komponenten, sondern ist ein Thin-Wrapper, der die TR1-Implementierung Ihrer Standardbibliothek enthält (falls vorhanden), andernfalls enthält sie die Boost-Bibliothek-Entsprechungen und importiert sie in den Namensraum
std::tr1
.
In Ihrem Beitrag scheint es, als wären Sie in erster Linie an VC ++ interessiert. Wenn das der Fall ist, dann denke ich, dass die Verwendung von Präprozessordefinitionen basierend auf _MSC_VER
wahrscheinlich die einfachste Lösung ist. Wie Sie angedeutet haben, finden Sie heraus, welche Versionen zuerst die verschiedenen Funktionen zur Verfügung stellen und die entsprechende Kopfzeile enthalten.
Was den Zugriff auf sie in Ihrem Code betrifft, würde ich einfach mehrere typedef
s verwenden, die je nach dem enthaltenen Header auf unterschiedliche Typen eingestellt sind. Wenn die Boost-, Tr1- und C ++ 0x-Versionen der Bibliotheken dieselben (oder ähnlich genug) Schnittstellen bereitstellen, sollte dies "einfach funktionieren". Wenn der Typ jedoch eine Klassenvorlage ist, funktionieren einfache typedefs nicht und Sie müssen auf eine # define zurückgreifen.
Manchmal ist geradlinig gut. Es mag sich nicht lohnen, es zu kompliziert zu machen. (Wenn Sie mehr als nur VC ++ unterstützen wollen, müssen Sie wahrscheinlich kompliziert werden.)
Vielleicht so etwas (als erster Gedanke):
%Vor%Obwohl ich es nicht mag, ein #define zu verwenden, um den Namensraum zu bekommen, kann ich mir keinen anderen Weg aus dem Kopf denken. Ich wette, dass es einen gibt.
Da Sie Boost bereits verwenden, sollten Sie die Makros, die Boost.Config bereitstellt , um nach potenziell unterstützten Funktionen zu suchen. Schauen Sie sich speziell die BOOST_HAS_TR1_*
-Makros und die BOOST_NO_*
-Makros an.
Beachten Sie, dass Sie nach einzelnen Features suchen müssen, da nicht alle Implementierungen von TR1 und C ++ 0x alle Features dieser Spezifikationen unterstützen.