C ++에서 변수를 통해 구조체의 멤버에 액세스


10

예를 들어 두 멤버가있는 구조체가 있습니다.

struct DataSet {
    int x;
    int y;
};

..., 그리고 메소드의 사람들에게 액세스해야하지만 한 번에 하나씩 만 액세스해야합니다.

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 당신이 맞아요. 이전에는 멤버로 두 개의 문자열이 있었지만 int로 변경했습니다. "std ::"를 제거하는 것을 잊었습니다.
Adrian

답변:


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.