首页 > 解决方案 > 指向成员复合的指针

问题描述

我有两个结构

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 上使用 c++17 和最新的 Xcode clang。

标签: c++ooppointer-to-member

解决方案


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

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

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

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


推荐阅读