2016-09-01 101 views
3

我正在使用名稱空間在不同版本的數據庫實現之間切換。我的客戶端代碼不需要知道詳細信息,因此我使用名稱空間別名來隱藏客戶端代碼中的特定版本。將項目添加到別名名稱空間

db_v1.h

namespace db_v1 
{ 
    class Database ... 
} 

db_def.h

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

namespace db = db_v1; 

現在,如果我想延長額外的項目,這是不特定版本的命名空間,我想將它們添加到命名空間db,但問題是我不能使用namespace db,因爲它是一個別名。

db_global.h

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

很顯然,我在這裏得到一個錯誤,因爲命名空間db已經存在,而我真正想要的是,在不知道至極版本擴展了命名空間是當前一個。

據我所見,我必須將這樣一個定義放入一個單獨的命名空間,如db_global,否則我將不得不在所有版本中複製這些符號,而我並不喜歡這些符號。

是否有某種方式來定義它,這樣我可以在客戶端代碼是這樣寫的:

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

我不認爲這是一個好方法...命名空間來避免名稱衝突,但你可能需要的是使用繼承和多態性,保持相同的名稱空間......有一個基類可以設置所有基本功能並讓派生類定義準確的行爲,這有什麼問題? – Jauch

回答

3

也許

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

namespace db { 
    using namespace db_v1; 
} 
db_def.h而不是 namespace db = db_v1;

?這樣db_v1的所有內容都被導入到db命名空間中。顯然,可以有條件地編譯:

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

例如,此代碼工作得很好:

namespace db_v1 { 
    void foo(){} 
} 

namespace db_v2 { 
    void foo(){} 
} 

namespace db { 
    using namespace db_v1; 
} 

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

AHHHH!很簡單!是的,我正在考慮如何使用'使用',但是我想的方向是錯誤的,因爲我對別名很滿意。 :) 謝謝! – Devolus

相關問題