C ++类/结构数据成员偏移为常量表达式
获取数据成员的偏移量就像这样容易:
#define MEMBER_OFFSET(Type, Member)
((unsigned long)(((char *)&((Type *)0)->Member) - (char *)0));
我想使它成为一个常量的编译时表达式(或使用类型特征)。例如,要使用它来实现使用成员偏移的基于SFINAE的解决方案,请使用静态断言等。
更新:问题是 - 如何使它成为编译时表达式。不是它是否适用于POD类型,或者C库中是否有标准宏等。
没有找到相关结果
已邀请:
3 个回复
炬卤遁蝎变
Gcc的扩展名为
。 VC似乎有能力为模板采用非编译时常量 奇怪的说法。 至于Comeau,我不知道Comeau的内部是
不幸。 顺便提一下,虽然这不能直接回答你的问题,但对于SFINAE 目的,因为成员指针常量可以用作模板参数 你可以专注于它,你可以写如下:
希望这可以帮助。
雄鞋谋塘
,可以执行此操作(但您可以在没有UB的情况下使用它)。不幸的是,将它应用于非POD类型仍然会给出未定义的行为,因此对于很多C ++来说它仍然是无用的。
襄挟款籍
是个坏主意。这些类型在使用32位和64位架构时特别有用 - 而GCC对printf的扩展名为“%zu”,以使用正确的字大小。 G ++在编译时计算它,至少使用-O2和-O3与POD类型