Здравствуйте, tyomitch-cs, Вы писали:
TC>На данном этапе, меня бы даже устроил совет, как реализовать это через reinterpret_cast, лишь бы заработало.
R>>Если хочешь получить дельную подсказку, опиши задачу немного более верхнего уровня.
То, что я сейчас напишу вряд ли можно
дельной подсказкой. Более правильное название этому — грязный хак. Но ты сам просил об этом. Итак, решаем задачу в первоначальной постановке, которая она была сделана
здесьАвтор: tyomitch-cs
Дата: 12.12.09
.
Для начала определим обобщенную функцию, которая по двум указателям — на член и на подчлен — возвращает их "суперпозицию", так сказать:
template<typename T, typename O1, typename O2>
T O1::* superposition(O2 O1::* mem, T O2::* sub)
{
int memValue = reinterpret_cast<int&>(mem);
int subValue = reinterpret_cast<int&>(sub);
int value = memValue + subValue;
return reinterpret_cast<T O1::*&>(value);
}
Теперь применим "инструмент" к данному тобой примеру:
#include <iostream>
struct A { float w; int x; };
struct B { char y; A z; };
int B::* p = superposition(&B::z, &A::x);
int main()
{
B b;
b.*p = 123;
std::cout << b.z.x << std::endl; //Output: 123
}
Надо заметить, что задачу, поставленную тобой
здесьАвтор: tyomitch-cs
Дата: 13.12.09
, решить будет сложнее, если вообще получится. Проблема в том, что трюки с реинтерпретацией указателей на члены здесь нужно будет проделать над константами времени компиляции. Как это сделать я пока еще не придумал. Склоняюсь к мысли, что это невозможно.