C ++の変数を介して構造体のメンバーにアクセスする


10

たとえば、2つのメンバーを持つ構造体があります。

struct DataSet {
    int x;
    int y;
};

...、そして私はメソッドでそれらにアクセスする必要がありますが、一度に1つだけです、例えば:

void foo(StructMember dsm) { // ("StructMember" does not exist)
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.dsm * ds.dsm << std::endl;
}
foo(x);
foo(y);

私が欲しい出力:

16
36

このような問題を解決する必要がある場合はどうすればよいですか?メンバーにアクセスできるデータ型はありますか?


私が考えることができる唯一のことは、ポインタ演算を使用できることです。構造体の「メンバー」として、構造体の先頭からの相対オフセットを渡すことができます。これは、メンバーのサイズによって異なります。intを使用すると、それらが単語の境界に揃えられることを保証できるので、dsm = 0にアクセスxdsm = 4てにアクセスしy、のようにアクセスしますint val = int(*(&ds+dsm))
ocket8888

1
@ ocket8888にc++はメンバーへのポインターがあるため、これを機能させるためにカスタムポインターハックを行う必要はありません。
スーパー

@eerorikaそうですね。以前はメンバーとして2つの文字列がありましたが、それらをintに変更しました。「std ::」を削除するのを忘れました。
エイドリアン

回答:


10

はい、メンバーへのポインターを使用できます。タイプの構文はTypeOfMember TypeOfStruct::*であり、アクセスするにはstruct_variable.*pointer_variable

using StructMember = int DataSet::*;  // Pointer to a member of `DataSet` of type `int`

void foo(StructMember dsm) {
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.*dsm * ds.*dsm << std::endl;
}

int main() {
    foo(&DataSet::x);
    foo(&DataSet::y);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.