Offsetof替代现代C ++

时间:2016-10-13 13:36:32

标签: visual-c++

我正在尝试将地图添加到我的数据类型中,该地图将成员名称字符串映射到成员变量的本地偏移量,如下所示:

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类型不起作用。

您是否有建议如何以兼容,现代的方式做我想要的事情?

谢谢!

2 个答案:

答案 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构造函数,因此映射将构建为运行时而不是编译时,但您可以将其替换为您自己的实现。

我使用了本地静态变量而不是静态成员,因为您需要将初始化包含在类定义中。