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

これは、厄介なnullポインタの間接参照を使用しないソリューションです;)

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ですか?こちらをご覧ください。また、ここsizeofで、とoffsetofをマクロに組み合わせたものもご覧ください。

お役に立てれば。

于 2010-01-25T00:30:22.403 に答える