2013-05-03 5 views
5

Ist es legal und guter Programmierstil zu verwenden als std::shared_ptr Platzierung using Direktive in entsprechenden Header? Gefällt mir:Ist es legal, tr1 :: shared_ptr im Namespace std im Header zu platzieren?

namespace std 
{ 
    using tr1::shared_ptr; 
} 

Ich weiß, dass es schlecht ist, den gesamten Namensraum zu verschmutzen, aber was ist mit diesem Fall? Gibt es versteckte Fallstricke? Ziel-Compiler ist VS2008, aber Kompatibilität mit späteren Versionen ist ebenfalls erwünscht.

+3

[Spätere Versionen sollten auch 'std :: tr1' unterstützen] (http://stackoverflow.com/a/2002972/241631). Compiler werden nicht den gesamten Namespace löschen. Sie kopieren Sachen von diesem in 'std', genau wie Sie es versuchen. Es sollte also lange nicht problematisch sein, sich auf den Typ als 'std :: tr1 :: shared_ptr 'zu beziehen. – Praetorian

+0

@cassini Was Praetorian sagte^Wenn Sie Ihre Route gehen wollten, müssten Sie Compiler-Checks im Präprozessor durchführen, um sicherzustellen, dass Sie keine Konflikte mit C++ 11 unterstützenden und zukünftigen Compilern bekommen, was unordentlich ist und nicht so flexibel und nicht so tragbar. – leetNightshade

+1

@leetNightshade Eigentlich ist alles oben. Zugegeben, es gibt leider keine "Compiler unterstützt Feature X" Prüfung, aber für die meisten Zwecke sollte eine einfache Präprozessor-Prüfung für die C++ - Version ausreichen, in Zukunft. –

Antwort

3

Technisch, sagt die Norm, dass man den Bereich der nicht definiertes Verhalten eingeben, wenn Sie dies tun:

17.6.4.2.1 Namespace std [namespace.std]

1 Das Verhalten Ein C++ - Programm ist nicht definiert, wenn Deklarationen oder Definitionen dem Namespace std oder einem Namespace innerhalb des Namespace std hinzugefügt werden, sofern nicht anders angegeben.

Aber in der Praxis werden Sie wahrscheinlich damit durchkommen. Heck, sogar Scott Meyers schlug einen ähnlich undefinierten Namensraum-Aliastrick in der wirkungsvollen C++ 3. Ausgabe vor. (Artikel 54, S.268), um die Boost-Funktionalität als Lückenfüller für die fehlende Funktionalität tr1 zu nutzen.

namespace std { using namespace tr1 = ::boost; } 

Ihre using-Deklaration ist auch nicht definiertes Verhalten, aber gehen Sie vor und springen rechts in

. HINWEIS: Kommentar mit einer großen, fetten Warnung, #define und #pragma um Ihre Compiler-Version und Warnungen, und so schnell Wenn Sie auf einen Compiler/eine Bibliothek upgraden, die tatsächlich über std::shared_ptr verfügt, stellen Sie sicher, dass Sie diesen Header erneut aufrufen und den Code entfernen.

+0

Um zur letzten Notiz hinzuzufügen: Kommentare sind nett und alle . Allerdings neigen sie dazu, genau das zu sein, Kommentare. Wenn Sie etwas mit etwas mehr Überzeugungskraft wollen, verwenden Sie stattdessen Präprozessordirektiven. Etwas in der Art von #if definiert (_MSC_VER) && (_MSC_VER> 1500) #fehler Bitte lesen Sie den folgenden Code erneut. #endif wird wahrscheinlich bei Bedarf eine Art von Aktion auslösen. – IInspectable

+0

@Tim tnx, guter Punkt. Aktualisiert! – TemplateRex

+0

Vielen Dank, aber ich möchte diesen Code nach dem Upgrade auf den neuen Compiler nicht erneut aufrufen. – cassini

Verwandte Themen