2013-05-23 3 views
1

나는이 같은 다른 구조 형식의 개체 배열을 포함하는 구조 있다고 가정 이식 포인터로 평가합니다 표현식을 작성하는포인터 :: 배열

struct foo { int x, y; }; 
struct bar { std::array<foo, 4> foos; }; 

가 가능을 지정된 배열 요소의 주어진 속성에 대한 -to-member? &bar::foos[2]::x과 같은 것?

응용 프로그램이 embind입니다. 가능한 경우 선형 JavaScript 튜플에 중첩 된 C++ 유형을 매핑하고 싶습니다. 이 포인터 - 투 - 회원을 사용하여 밖으로 작동하지 않는 경우, 대신 아마도 getter 및 setter 메서드를 사용하여 시도 할 수 있지만 여전히 포인터 - 투 - 멤버 얻는 방법이 있는지 알고 싶습니다.

답변

1

나는 그런 것을 할 수 있다고 생각하지 않습니다. foos[2]bar의 구성원이 아니며 foos입니다. 멤버가 아닌 다른 것으로부터 포인터를 가져올 수 없습니다. 문단 C++ 11 표준 지정 5.3.1/4

명시 & 사용 및 피연산자 호로 아닌 정규화-ID 인 경우 부재 포인터에만 형성된다.

이 문법 자체가처럼 보이지 않는 아무것도를 작성하지 못하도록 의미 class_name 자체가 자격을 갖춘 이름이 될 수

&class_name::member_name 

. 첨자 연산자 나 공상 표기법은 허용되지 않습니다.

+0

좋아요, 따라서 직관적 인 포인터 투 회원식이 유효하지 않습니다. 그러나 그것은 다른 영리한 수단을 사용하여'int foo :: * '를 얻을 수 없다고 말합니까? 개개의 오프셋이나 일부 offsetoff를 결합하는 포인터 연산과 비슷합니까? 결국, 모든 유형과 오프셋을 알고 있으므로 기술적으로 가능합니다. – MvG

+0

@MvG : 흠.하지만'int'로 어떻게 할거 니? AFAIK 포인터에 대한 포인터의 표현은 지정되지 않았으므로 코드가 이식 가능할 것이라고 생각하지 않습니다. 그리고 그것이 지정되었다 할지라도, foos [2]는 'A'의 멤버가 아니기 때문에, 어쨌든 포인터에 대한 멤버로 끝나지 않을 것입니다. 'a. * pF2 = 42'와 같은 것을 할 수 없습니다. –

+0

'int. foo :: * ptm'에'a. * ptm = 42'가'a.foos [2] .y = 42'와 같을 것을 기대했을 것입니다. 차례 차례로'reinterpret_cast (& a) [2 * 2 + 1] = 42'와 동등합니다. – MvG