Как напечатать адрес члена данных (в смещении класса) с помощью & quot; cout & quot;

У меня есть класс ниже:

class A
{
public:
double a;
float b;
double c;
};

Я хочу напечатать смещение члена данных в классе, чем я использую:

double A::* pm = &A::a;
cout << *(int *)&pm << endl;

Он хорошо работает и выдает «0», но я не хочу использовать промежуточную переменную pm

cout << *(int *)&A::a << endl;

Я получил ошибку компиляции с: Неверное преобразование типов

2

Решение

С смещение Предполагается, что вы ссылаетесь смещение в байтах.

Вы можете попробовать это решение:

(size_t) &(((A*)0)->a) // prints 0

На самом деле это реализация макроса offsetof как WhozCraig предложил.

 ...
cout << "A::a => " << (size_t) &(((A*)0)->a)
<< "\nA::b => " << (size_t) &(((A*)0)->b)
<< "\nA::c => " << (size_t) &(((A*)0)->c);
...

В сочетании с вашими данными предыдущий фрагмент напечатает:

A::a => 0
A::b => 8
A::c => 16
0

Другие решения