Re[2]: как определить хитрый указатель...
От: Павел Кузнецов  
Дата: 06.03.02 12:52
Оценка:
Kaa>2. Все плохо для нестатических методов классов. В общем случае (описано в Стандарте) вызов нестатического метода через указатель должен осуществляться принепосредственном участии объекта, для которого делается вызов. Обычным приведением типов это делается для случая одиночного наследования (см. http://rsdn.ru/forum/message.asp?mid=24451
Автор: Андрей Тарасевич
Дата: 26.01.02
и вокруг. Ссылку проверить не могу, т.к. сервер еле шевелится.) Как же написано в том сообщении, которое я имею ввиду, ситуация с таким приведением для случая множественного наследования "... не будет работать в ста процентов случаев." (с) Андрей Тарасевич (когда сервак оживет, можно поиск по этой фразе устроить). В этом случае информация о смещении текущей таблицы вирт. функций (в которой находится вызываемый тобой метод) теряется, и могут быть варианты.


Насколько я понимаю, это дело поправляется комбинацией описанного подхода с генерацией промежуточных функций для вызова методов. Вот пример генератора для вызова метода с двумя аргументами:

template<class R, class T, class A1, class A2, R(T::*m)(A1, A2)>
R method_thunk(T* t, A1 a1, A2 a2)
{
  return (t->*m)(a1, a2);
}


В результате можно слегка поправить предложенный парнями из Microsoft класс и передавать в него вместо &A::getParam адрес соответствующей промежуточной функции: method_thunk<double, A, int, int, &A::getParam>. Такой подход будет работать и в случае множественного или виртуального наследования.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.