17

我知道这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
}
4

3 回答 3

27

另一种方法无需默认构造函数即可工作:

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

您可以将其包装在宏中,以便更好地阅读:

#define member_sizeof(T,F) sizeof(((T *)0)->F)
于 2010-01-25T00:22:42.913 回答
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;
}
于 2010-01-25T01:12:23.703 回答
0

怎么样offsetof?看看这里。也看看这里,它结合了sizeofoffsetof成一个宏。

希望这可以帮助。

于 2010-01-25T00:30:22.403 回答