我知道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
}
答案 0 :(得分:27)
另一种方法无需默认构造函数即可运行:
return sizeof(((X *)0)->x);
您可以将其包装在一个宏中,以便更好地阅读:
#define member_sizeof(T,F) sizeof(((T *)0)->F)
答案 1 :(得分:10)
这是一个没有令人讨厌的空指针解除引用的解决方案;)
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;
}
答案 2 :(得分:0)