我正在尝试将地图添加到我的数据类型中,该地图将成员名称字符串映射到成员变量的本地偏移量,如下所示:
struct E
{
B memberX;
B memberY;
constexpr static entry map[] = {
{ "memberX", offsetof( E, memberX ) },
{ "memberY", offsetof( E, memberY) }
};
};
这不能用VS2015编译。如果在{“memberX”,offsetof(E,memberX)}失败,错误C2227。
此外,我知道offsetof对非pod类型不起作用。
您是否有建议如何以兼容,现代的方式做我想要的事情?
谢谢!
答案 0 :(得分:1)
这种方式不是现代的,但offsetof通常定义如下:
#define offsetof(type, memb) (intptr_t)&(((type)NULL)->memb)
所以你可以尝试使用它作为替代。
答案 1 :(得分:0)
我假设您只想稍后使用偏移来访问成员。在这种情况下,并且鉴于所有成员具有相同的类型,指向数据成员的指针可能更安全且更通用:
struct E
{
B memberX;
B memberY;
static const auto& getMemberMap {
static const std::map<std::string, B E::*> memberMap {
{ "memberX", &E::memberX },
{ "memberY", &E::memberY }
};
return memberMap;
};
B& getMember(const std::string& str) {
auto it = getMemberMap().find(str);
if(it == getMemberMap().end()) {
// throw some exception
}
return this->*(it->second);
};
};
std::map
没有constexpr
构造函数,因此映射将构建为运行时而不是编译时,但您可以将其替换为您自己的实现。
我使用了本地静态变量而不是静态成员,因为您需要将初始化包含在类定义中。