Почему sizeof не разбирает членов структуры? - PullRequest
17 голосов
/ 25 января 2010

Я знаю, что sizeof - это вычисление времени компиляции, но мне это кажется странным: компилятор может принимать либо имя типа, либо выражение (из которого он выводит тип). Но как вы определяете тип в классе? Кажется, единственный способ - передать выражение, которое кажется довольно неуклюжим.

struct X { int x; };
int main() {
    // return sizeof(X::x); // doesn't work
    return sizeof(X()::x); // works, and requires X to be default-constructible
}

Ответы [ 3 ]

27 голосов
/ 25 января 2010

Альтернативный метод работает без использования конструктора по умолчанию:

return sizeof(((X *)0)->x);

Вы можете обернуть это в макрос, чтобы он читался лучше:

#define member_sizeof(T,F) sizeof(((T *)0)->F)
10 голосов
/ 25 января 2010

Вот решение без разыменования неприятного нулевого указателя;)

struct X { int x; };

template<class T> T make(); // note it's only a declaration

int main()
{
    std::cout << sizeof(make<X>().x) << std::endl;
}
0 голосов
/ 25 января 2010

А как насчет offsetof? Взгляните здесь . Также посмотрите здесь , который объединяет sizeof и offsetof в макрос.

Надеюсь, это поможет.

...