Re[3]: указатель на под-член
От: rg45 СССР  
Дата: 13.12.09 08:10
Оценка:
Здравствуйте, 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
, решить будет сложнее, если вообще получится. Проблема в том, что трюки с реинтерпретацией указателей на члены здесь нужно будет проделать над константами времени компиляции. Как это сделать я пока еще не придумал. Склоняюсь к мысли, что это невозможно.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.