2016-09-01 3 views
3

Ich verwende einen Namespace, um zwischen verschiedenen Versionen meiner Datenbankimplementierung zu wechseln. Mein Client-Code sollte die Details nicht kennen müssen, daher verwende ich einen Namespace-Alias, um die bestimmte Version vor dem Client-Code zu verbergen.Hinzufügen von Elementen zu einem Aliasnamen-Namespace

db_v1.h

namespace db_v1 
{ 
    class Database ... 
} 

db_def.h

#ifdef _DB_V1 
    #include "db_v1.h" 
#endif 

namespace db = db_v1; 

Wenn ich nun den Namensraum mit zusätzlichen Elemente erweitern möchten, die nicht Version spezifisch sind, würde Ich mag sie zu den hinzufügen Namespace db, aber das Problem ist, dass ich namespace db nicht verwenden kann, weil es ein Alias ​​ist.

db_global.h

namespace db <-- should be using the namespace for the current version 
{ 
    typedef enum 
    { 
     OK 
    } value; 
} 

Offensichtlich bekomme ich einen hier Fehler, da der Namespace db bereits vorhanden ist, während das, was ich wirklich will ist, den Namensraum zu verlängern, ohne zu wissen, wich Version ist die aktuelle.

Soweit ich sehen kann, müsste ich eine solche Definition in einen separaten Namespace wie db_global setzen oder ich müsste solche Symbole in allen Versionen duplizieren, was mir nicht wirklich gefällt.

Gibt es eine Möglichkeit, es so zu definieren, dass ich wie im Client-Code etwas schreiben kann:

x = db::value::OK; 
+0

Ich glaube nicht, das ist ein guter Ansatz ... Namespaces werden verwendet, um Namenskollision zu vermeiden , aber was Sie wahrscheinlich brauchen, ist, mit Vererbung und Polymorphismus zu arbeiten und denselben Namespace beizubehalten ... Was ist das Problem mit einer Basisklasse, die alle Basisfunktionen aufbaut und abgeleitete Klassen definiert, um genau das Verhalten zu definieren? – Jauch

Antwort

3

Vielleicht

#ifdef _DB_V1 
    #include "db_v1.h" 
#endif 

namespace db { 
    using namespace db_v1; 
} 

in db_def.h statt namespace db = db_v1;? Auf diese Weise werden alle Inhalte von db_v1 in den Namensraum db importiert. Offensichtlich kann es sein, bedingt kompiliert:

namespace db { 
#ifdef _DB_V1 
    using namespace db_v1; 
#elif defined _DB_V2 
    using namespace db_v2; 
#endif 
} 

Zum Beispiel dieser Code funktioniert gut:

namespace db_v1 { 
    void foo(){} 
} 

namespace db_v2 { 
    void foo(){} 
} 

namespace db { 
    using namespace db_v1; 
} 

namespace db { 
    typedef enum 
    { 
     OK 
    } value; 
} 
+1

AHHHH! So einfach! Ja, ich habe darüber nachgedacht, wie man 'using' verwendet, aber ich habe in die falsche Richtung gedacht, weil ich so auf den Alias ​​gesetzt war. :) Vielen Dank! – Devolus

Verwandte Themen