web-dev-qa-db-ja.com

構造体のインスタンスを作成せずに構造体フィールドのサイズを取得できますか?

構造体のインスタンスがある場合、C++で構造体のフィールドのサイズを取得するのは簡単です。例えば。 (未コンパイル):

typedef struct Foo {
    int bar;
    bool baz;
} Foo;

// ...

Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie

今でもこのようなことができますが、実装しているインターフェイス(ビットフィールドの特定のビットの状態を示すBOOLを取得します)を使用して、サイズを取得するためだけに構造体を作成しますデータメンバーの。構造体のインスタンスを作成せずに、構造体のフィールドのサイズを使用する必要があることをコンパイラーに示す方法はありますか?これは、次の哲学的な同等物になります。

SetBit(bool val) {
    StoreInSomething(
        BITFIELD_POSITION_CONSTANT, // position of bit being set
        val,                        // true = 1, false = 0
        sizeof(Foo::bar));          // This is, of course, illegal.  (The method I've been told I must use req's the size of the target field.)
}

スタック上に構造体を作成するのは速くて安価なはずですが、コードレビューでそれを気に入ると思うので、追加のメンテナンス負担を導入しないより良い方法を探しています( #defines for size)。

30
Greg D

次のような式を使用できます。

sizeof Foo().bar

sizeofの引数は評価されず、その型のみが評価され、一時的なものは実際には作成されません。

編集

Fooがデフォルトで構成可能でない場合(例とは異なり)、ポインターを含む式など、別の式を使用する必要があります。 (Mike Seymourに感謝します)

sizeof ((Foo*)0)->bar
38
CB Bailey
typedef struct Foo { 
    typedef BarType int;
    BarType bar; 
    bool baz; 
} Foo;

.。

sizeof(Foo::BarType)
9
Binary Worrier