Ответ 1
Альтернативный метод работает без использования конструктора по умолчанию:
return sizeof(((X *)0)->x);
Вы можете обернуть это макросом, чтобы он читал лучше:
#define member_sizeof(T,F) sizeof(((T *)0)->F)
Я знаю, что 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
}
Альтернативный метод работает без использования конструктора по умолчанию:
return sizeof(((X *)0)->x);
Вы можете обернуть это макросом, чтобы он читал лучше:
#define member_sizeof(T,F) sizeof(((T *)0)->F)
Вот решение без отвратительного разыменования нулевых указателей;)
struct X { int x; };
template<class T> T make(); // note it only a declaration
int main()
{
std::cout << sizeof(make<X>().x) << std::endl;
}
Как насчет offsetof
? Посмотрите здесь. Также посмотрите здесь, который объединяет как sizeof
, так и offsetof
в макрос.
Надеюсь, что это поможет.