将项添加到别名命名空间

时间:2016-09-01 07:42:04

标签: c++ namespaces

我正在使用命名空间在我的数据库实现的不同版本之间切换。我的客户端代码不需要知道详细信息,因此我使用命名空间别名来隐藏客户端代码中的特定版本。

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;

1 个答案:

答案 0 :(得分: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;
}