Здравствуйте PaNov, Вы писали:
PN>есть:
PN>typedef double (*FuncGetParam)(int i,int j);
PN>// некий класс, содержащий указатель на функцию
PN>class A
PN>{
PN> public :
PN> FuncGetParam func; // указатель на функцию
PN> double getParam(int i, int j);
PN>};
PN>// это произвольный класс
PN>class B
PN>{
PN> public :
PN> double getParam(int i, int j);
PN>};
PN>// это произвольная функция...
PN>double freeGetParam(int i, int j)
PN>{
PN> return 1.0;
PN>}
PN>надо сделать так, чтобы чтобы можно было присвоить указатель на произвольную функцию (совпадающую по передаваемым параметрам и возвращаемому результату), которая может быть как в самом классе "A", в другом классе "B", а может быть и просто отдельной функцией!
PN>{
PN> A a;
PN> B b;
PN> // надо, чтобы все эти варианты могли работать
PN> A.func = a.getParam;
PN> A.func = b.getParam;
PN> A.func = freeGetParam;
PN>}
PN>в С++ Builder это делается определением функции вот таким способом:
PN>typedef double (__closure *FuncGetParam)(int i,int j);
PN>ключевое слово — "__closure"
PN>как такое же сделать в Visual C++ ?????
PN>если стандартными способами это не делается, покажите, как реализовать нестандартными...
Стандартными способами это не делается.
1. Все в порядке для обычных функций и для статических методов классов. Эта техника сработает.
2. Все плохо для нестатических методов классов. В общем случае (описано в Стандарте) вызов нестатического метода через указатель должен осуществляться принепосредственном участии объекта, для которого делается вызов. Обычным приведением типов это делается для случая одиночного наследования (см.
http://rsdn.ru/forum/message.asp?mid=24451Автор: Андрей Тарасевич
Дата: 26.01.02
и вокруг. Ссылку проверить не могу, т.к. сервер еле шевелится.) Как же написано в том сообщении, которое я имею ввиду, ситуация с таким приведением для случая множественного наследования "... не будет работать в ста процентов случаев." (с) Андрей Тарасевич (когда сервак оживет, можно поиск по этой фразе устроить). В этом случае информация о смещении текущей таблицы вирт. функций (в которой находится вызываемый тобой метод) тепряется, и могут быть варианты.
С уважением