Подтвердить что ты не робот

Почему параметр sizeof parse struct не имеет значения?

Я знаю, что 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
}
4b9b3361

Ответ 1

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

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

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

#define member_sizeof(T,F) sizeof(((T *)0)->F)

Ответ 2

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

struct X { int x; };

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

int main()
{
    std::cout << sizeof(make<X>().x) << std::endl;
}

Ответ 3

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

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