微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gcc 9

如何解决gcc 9

我之前使用它根据传入的成员对象指针来提取对象成员的 size_t 偏移量。

template <typename T,typename U>
constexpr size_t memberOffset(U T::*member)
{
    return (char*)&((T*)nullptr->*member) - (char*)nullptr;
}

struct Point{float x,y,z; };

memberOffset(&Point::y) == 4;

我使用它作为反射库的一部分来散列两种类型以实现兼容性。浏览器

struct Point{ float x,z;};
struct Point3d{float x,z;};

出于序列化目的,上述两个是相同的,因此使用 x,z 类型的附加元数据和成员名称,我可以为这两种类型生成哈希并检查兼容性。
在 gcc 9 中,由于 constexpr 函数中的 UB,memberOffset 函数现在被破坏了。我正在寻找不调用 UB 或 gcc 9 解决方法的 constexpr 版本。 __builtin__offsetof 不采用相同的语法,因此与我已经开发的内容不兼容。

[编辑]

为了更清晰,这被用作我编写的元编程库的扩展的一部分。大部分代码与使用成员对象指针等为结构生成序列化和绑定代码有关。因此,该库通常如下使用:

template<>
struct MetaData<Point3d>{
  auto getMember(integral_constant<0>){ return makeMemberObjectPointer("x",&Point3d::x); }
  auto getMember(integral_constant<1>){ return makeMemberObjectPointer("y",&Point3d::y); }
  auto getMember(integral_constant<2>){ return makeMemberObjectPointer("z",&Point3d::z); }
};

由于代码已经在任何地方使用了成员对象指针,我希望能够使用现有的东西来提取偏移量,而不必通过额外调用 offsetof 来更新每个调用点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。