2016-09-01 1 views
3

私はネームスペースを使用して、異なるバージョンのデータベース実装を切り替えています。私のクライアントコードは詳細を知る必要はないので、名前空間エイリアスを使用して特定のバージョンをクライアントコードから隠す必要があります。 エイリアスネームスペースにアイテムを追加する

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

namespace db = db_v1; 

db_def.h

db_v1.h

namespace db_v1 
{ 
    class Database ... 
} 

私はバージョン固有のものではありません追加項目、で名前空間を拡張したい場合は今、私はそれらを追加したいと思います名前空間dbですが、問題は、別名であるためnamespace dbを使用できないことです。

db_global.h明らか

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

名前空間dbがすでに存在しているので、私が本当にしたいことはウィッヒバージョンを知らなくても、名前空間を拡張するために、あるとき私は、ここでエラーを取得するには、現在のものです。

私が見る限り、このような定義をdb_globalのような別の名前空間に入れる必要があります。そうしないと、すべてのバージョンでそのようなシンボルを複製する必要があります。 db_def.h代わりのnamespace db = db_v1;

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

私は、これは良い方法だとは思わない...名前空間は、名前の衝突を回避するために使用されていますしかし、おそらくあなたが必要とするのは、継承と多態性を使って同じ名前空間を維持することです。基本クラスにすべての基本機能を設定し、派生クラスに厳密な振る舞いを定義させる問題は何ですか? – Jauch

答えて

3

たぶん

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

namespace db { 
    using namespace 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

関連する問題