gpt4 book ai didi

C++ 类/结构数据成员偏移量作为常量表达式

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:23 36 4
gpt4 key购买 nike

获取数据成员的偏移量就这么简单:

#define MEMBER_OFFSET(Type, Member) \
((unsigned long)(((char *)&((Type *)0)->Member) - (char *)0));

我想让它成为常量编译时表达式(或使用类型特征)。例如,要使用它来使用成员偏移量实现基于 SFINAE 的解决方案,使用它静态断言等。

更新:问题是 - 如何使其成为编译时表达式。不是它是否适用于 POD 类型,或者 C 库中是否有标准宏等。

最佳答案

虽然我不知道你的编译器是什么,以下代码可以用VC8、ideone(gcc-4.3.4)、Comeau编译在线:

struct A { int i; };
template< size_t > struct S;

int main() {
S< offsetof( A, i ) > *p;
}

Gcc 有 __offsetof__ 扩展名。VC 似乎有能力为模板获取非编译时常量奇怪的争论。至于Comeau,我不知道Comeau的offsetof内部不幸的是。

顺便说一句,虽然这不会直接回答你的问题,至于 SFINAE目的,因为成员指针常量可以用作模板参数你可以专攻它,你可以这样写:

struct A {
int i, j;
};

template< int A::* > struct S;
template<> struct S< &A::i > { static char const value = 'i'; };
template<> struct S< &A::j > { static char const value = 'j'; };

int main() {
cout<< S< &A::i >::value <<endl;
cout<< S< &A::j >::value <<endl;
}

希望这对您有所帮助。

关于C++ 类/结构数据成员偏移量作为常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899476/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com