我有一个外部Parameter class
,我需要定义为不同名称空间内的全局对象(实例)。我将类的每个实例的指针插入到映射中。
问题:
不是所有的参数名称都是唯一的,我需要一个唯一的名称作为每个实例的关键,我可以得到对象名称的命名空间层次结构作为他的名字的前缀吗?
RegisteredGlobalObject.cpp:
RegisteredGlobalObject::RegisteredGlobalObject(const string& uid, int val) {
m_mapUidToParamPair[uid] = val;
}
ParamsDef.h:
namespace base {
namespace vpeservice {
extern RegisteredGlobalObject int_64_param;
} // namespace vpeservice
namespace otherservice {
extern RegisteredGlobalObject int_64_param;
} // namespace otherservice
} // namespace base
ParamsDef.cpp:
namespace base {
namespace vpeservice {
RegisteredGlobalObject int_64_param(getInstatnceDefenitionPlaceStr()+"int_64_param", 1);
}
namespace otherservice {
RegisteredGlobalObject int_64_param(getInstatnceDefenitionPlaceStr()+"int_64_param", 2);
}
}
我可以实现函数getInstatnceDefenitionPlaceStr()
返回"base::vpeservice
";对于第一个电话和"base::otherservice
";第二个呢?
好了,这就是我的解决方案。希望对大家有所帮助。
我定义了一个宏每个内部命名空间,它将在命名空间内定义一个函数来获取当前的__PRETTY_FUNCTION__
路径。
然后我使用了如何在c++ (gcc)中获得一个完全限定的函数名称,并进行了一些修改(您可以在宏中看到f(__PRETTY_FUNCTION__,__func__)
调用:
#define PARAMETERS_SECTION(name) namespace name {
std::string getPath()
{
return f(__PRETTY_FUNCTION__,__func__);
}
#define configureParam(type, name, val) RegisteredGlobalObject name(getPath()+#name, val);
然后我修改了ParamsDef.cpp:
namespace base {
PARAMETERS_SECTION(vpeservice) {
configureParam(int64_t, int_64_param, 1)
}
PARAMETERS_SECTION(otherservice) {
configureParam(int64_t, int_64_param, 2)
}
}
和got keys:
基础:vpeservice: int_64_param
基础:otherservice: int_64_param