Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Можно, конечно. Я специально слегка усложнил — переставил местами родителей
PD>PD>#include "stdafx.h"
PD>#include "stddef.h"
PD>struct A { float w; int x; } ;
PD>struct B { char y; } ;
PD>struct C : public B, public A { } ;
PD>int _tmain(int argc, _TCHAR* argv[])
PD>{
PD> // хочу доступ к C::A::x
PD> C c;
PD> B* pB = (B*)&c;
PD> A* pA = (A*)&c;
PD> int offsetAinC = (char*) pA - (char*) pB; // а вот в этом быть уверенным я не могу ИМХО. Или могу ? Знатоки стандарта, ответьте!
PD> int mem = offsetAinC + offsetof(A,x) ;
PD> int C::* p = (int C::*&) mem;
PD> c.*p = 123;
PD> return 0;
PD>}
PD>
PD>Но вообще — безобразие все это. Грязный хак, вполне согласен с rg45.
Не совсем то, что я имел в виду (мне нужен был C::A, а не C::A::x), но идея понятна.
Кстати, в gcc (и вроде бы стандартом тоже) запрещены касты из int в (int C::*&); ради такого преобразования предыдущим отписавшимся в треде и пришлось городить чёрти-что из шаблонов и юнионов.
Спасибо.