У меня есть класс ниже:
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;
Я получил ошибку компиляции с: Неверное преобразование типов
С смещение Предполагается, что вы ссылаетесь смещение в байтах.
Вы можете попробовать это решение:
(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