我正在使用命名空间在我的数据库实现的不同版本之间切换。我的客户端代码不需要知道详细信息,因此我使用命名空间别名来隐藏客户端代码中的特定版本。
namespace db_v1
{
class Database ...
}
#ifdef _DB_V1
#include "db_v1.h"
#endif
namespace db = db_v1;
现在,如果我想使用其他非特定于版本的项目扩展命名空间,我想将它们添加到命名空间db
,但问题是我无法使用namespace db
因为它是别名。
namespace db <-- should be using the namespace for the current version
{
typedef enum
{
OK
} value;
}
显然我在这里得到一个错误,因为命名空间db
已经存在,而我真正想要的是,扩展名称空间而不知道版本是当前版本。
据我所知,我必须将这样的定义放入一个单独的命名空间,例如db_global
,否则我将不得不在所有版本中复制这些符号,我并不喜欢。
是否有某种方法可以定义它,以便我可以在客户端代码中编写如下内容:
x = db::value::OK;
答案 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;
}