我有两个结构

struct A
{
    int a, b;
};
struct B
{
    A c, d;
};

我想获得一个指向b中的成员d的指针。
&B::d.b; // int B::*

我能得到的最接近的是它的偏移量。
offsetof(B, d.b) // size_t

但这没有大小或类型信息,因此,我能做的最好是制作一个将偏移量和类型一起传递的宏,而不是int B::*
有什么标准解决方案吗?是否有任何非标准解决方案?
在非标准方向上,我正在考虑制作一个像T<&B::d, &A::b>这样使用的模板,该模板将重新解释偏移量并将其相加在一起,但是我不确定如何执行重新解释部分。
我在macOS上使用带有最新Xcode clang的c++ 17。

最佳答案

您可以使用两个成员指针:

int A::* foo = &A::b;
A B::* bar = &B::d;

B objB;
int& db = objB.*bar.*foo;

缺点是每个偏移量都是分开存储的,如果在运行时完成,则不必要地效率低下。不过对于编译时元编程应该没问题。

10-08 08:14
查看更多