Указатель на членство - PullRequest
       43

Указатель на членство

2 голосов
/ 14 октября 2019

У меня есть две структуры

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> и будет интерпретировать смещения и добавлять их вместе, но я не уверен, как это сделатьпереосмысление части.
Я использую C ++ 17 с последним XClan Clang на MacOS.

1 Ответ

1 голос
/ 14 октября 2019

Вы можете использовать два указателя элемента:

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

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

Недостатком является то, что каждое смещение хранится отдельно, что излишне неэффективно, если оно выполняется во время выполнения. Должно быть хорошо для метапрограммирования времени компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...