c++ - 有什么方法可以在编译时检查一个成员是否是最后一个类数据成员?

标签 c++ static-assert

当前的运行时实现如下:

#define ASSERT_LAST_Member(Class, Member)  {Class foo; assert(((size_t)(&foo) + sizeof(foo)) == ((size_t)(&foo.Member) + sizeof(foo.Member)));}

如何在编译时进行静态断言?我试过这样做,但没有成功。

#define assert_static(e) \
   do { \
      enum { assert_static__ = 1/(e) }; \
      } while (0)
#define ASSERT_LAST_Member(Class, Member) { assert_static(((size_t)&((Class*)0)->Member)+sizeof(((Class*)0)->Member)==sizeof(Class)) }

最佳答案

您不能真正断言某个成员是今天同类中的最后一个成员。响应N3814的提案一旦被接受和实现,可能会使这成为可能,但它们今天不可用。使用当前可用的内容,您仍然会因为填充问题而沉没(请参阅评论中 Csq 的示例)。

如果您忽略填充的限制,并将自己限制在没有虚拟继承的“普通旧数据”情况下,您可能可以使用 offsetof macro ,或来自 How to calculate offset of a class member at compile time? 的建议执行您想要的检查。

但在实践中,根据您关于所有类都是协议(protocol)类的评论,您不能只对已知的类大小进行断言吗?当成员被重新排序时,或者当添加适合填充时,它不会捕捉到情况。但是静态断言实际上只是为了防止意外的不正确更改,并且您声称不使用填充。所以简单点:

static_assert(sizeof(Foo) == 12, "Size of Foo has changed");

关于c++ - 有什么方法可以在编译时检查一个成员是否是最后一个类数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24063679/

相关文章:

c++ - C++ regex_replace 中的后缀 ($´) 不起作用

c++ - 指示方向的迷宫解算器

c++ - 从 WndProc 调用非静态成员

c1 1's ' Generic' 关键字可以在 gcc _Static_assert 中使用吗

c++ - 我不知道为什么这个 static_assert() 代码不起作用

c++ - 我如何获得指向模板类中定义的友元函数的函数指针

c++ - 引用变量在下一行程序执行后显示未定义的行为

c++ - 如何静态断言多个类的公共(public)属性

c++ - 如何将static_assert与sizeof和stringify结合起来?

c++11 - 如何使用 C++11 static_assert 进行类型约束?