如果成员是最后一个类数据成员,任何方式进行编译时检查?

时间:2014-06-05 15:02:27

标签: 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)) }

1 个答案:

答案 0 :(得分:1)

你无法断言一个成员是今天最后一个成员。一旦接受并实施,回复N3814的提案可能会使这成为可能,但它们今天无法使用。根据当前可用的内容,由于填充问题,您仍然沉没(请参阅评论中的Csq&#39示例)。

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

但实际上,根据你对所有类的协议类的评论,你不能只针对已知的类大小做一个断言吗?当成员被重新排序时,或者在填充中添加适合的情况时,它不会捕获案例。但静态断言实际上只是为了防止意外的错误更改,并且您声称不使用填充。所以说简单:

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