当前的运行时实现如下:
#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/