![]() |
![]() |
Kostyan 07.04.2004 - 14:56 |
template<class CLASS> void ForEach(CLASS *pHandler,void (CLASS::*lpfCall)(CObject *)) { CObject **ppObj = ...указатель на массив объектов,кот. заканчивается 0 while(*ppObj) { (pHandler ->*lpfCall)(*ppObj); ppObj++; } } надо в вызове ForEach для каждого CObject вызывать функцию lpfCall из объекта типа CLASS. При крмпиляции ошибка - не может вывести аргумент из шаблона. Как это можно обойти? |
lesha 1 - 07.04.2004 - 23:03 | Какой компилятор? |
Kostyan 2 - 08.04.2004 - 09:00 | VC6 |
lom 3 - 08.04.2004 - 10:25 | Кстати - вопрос по схожей теме... Почему реализацию методов шаблона необходимо делать в том же файле что и определение шаблонного класса, иначе он пишет unresolved externals ? |
Тигренок 4 - 08.04.2004 - 11:32 |
например так: ////////////////////////////////////////////////// template<class _Fn> void ForEach(_Fn functor) { CObject **ppObj = ...указатель на массив объектов,кот. заканчивается 0 while(*ppObj) { functor(*ppObj); ppObj++; } } ////////////////////////////////////////////////// template<class CLASS> class callMethod1 { public: callMethod1(CLASS* init_handler): handler(init_handler) {}; void operator () (CLASS* object) { handler->method1(object); } private: CLASS* handler; }; //////////////////////////////////////////////////////////// template<class CLASS> class callMethod1 { .......... аналогично callMethod2 } //////////////////////////////////////////////////////////// ........... ForEach(callMethod1<CObject>(myHandler)); ForEach(callMethod2<CObject>(myHandler)); |
Тигренок 5 - 08.04.2004 - 11:34 |
хотя скорее даже не void operator () (CLASS* object) а void operator () (CObject* object) |
UE 6 - 08.04.2004 - 12:43 | 2lom: postav' sebya na mesto compilera. nelzya pomestit' kod shablona v ob'ektnik - tam zhe uzhe machine code. kak potom specializacii generit'? itogo: shablon dolzhen bit' dostupen na etape kompilaycii. |
Kostyan 7 - 08.04.2004 - 13:24 | 2Тигренок - сейчас я так и сделал - через объекты-функции, но меня в частности интересовал вызов члена функции объекта CLASS. В этом случае я бы мог в одном классе CLASS реализовать несколько функциональностей для ForEach и не создавать множество объектов-функций. Это обуслевлено требованиями читабельности (меньше классов), побочных ограничений, лени. По идее С++ может сгенерировать код если компилятору "показать правильный путь", т.к. реализация аналогичной функциональности на asm проста, но в этом случае есть "-" - привязка к процессору. Огромное спасибо !!!!! |
lom 8 - 08.04.2004 - 14:43 | UE - честно говоря не совсем понял ... |
Тигренок 9 - 08.04.2004 - 18:34 |
[7] напиши макрос DECLARE_FUNCTOR() и USE_FUNCTOR() :) что-то вроде такого: | #define DECLARE_FUNCTOR(method_name) \ template<class CLASS> \ class call##method_name { \ public: \ call##method_name(CLASS* init_handler): handler(init_handler) {}; \ void operator () (CLASS* object) {handler->##method_name(object);}; \ private: \ CLASS* handler; \ }; //////////////////////// #define CALL_FUNCTOR(handler, method_name) call##method_name(##handler) //////////////////////// DECLARE_FUNCTOR(method1); DECLARE_FUNCTOR(method2); ... ForEach(CALL_FUNCTOR(myHandler, method1)); ForEach(CALL_FUNCTOR(myHandler, method2)); |
UE 10 - 10.04.2004 - 03:12 | 2lom: представь себе, что ты компилятор. У тебя есть cpp-шник, где ты реализовал твой шаблон. И вот ты, значится, компилишь этот файл, превращая его в объектник... а как, спрашивается? какой такой код ты запихнешь в объектник, ведь у тебя параметром шаблона может быть что угодно! поэтому шаблоны следует воспринимать как продвинутые макросы ;) |
lom 11 - 10.04.2004 - 17:03 | UE - спасибки дошло ;) ... я главное шаблоны давно юзаю, но как -то обычно реализации оказывались вместе с объявлениями.. А тут большой шаблон реализовал и распихал по разным файлам - и хоппа - обломс ! :))) |
Уп 12 - 10.04.2004 - 17:16 |
На самом деле не совсем так:) Как пишет Страуструп, в стандарте есть такая фишка export Например(из книги) в out.h файле template<class T> void out(const T& t) В out.cpp файле #inсludе <iostream> #inсludе "out.h" export template<class T> void out(const T& t) { std::cout<<t; } |
Уп 13 - 10.04.2004 - 17:18 | Проверь:) мож работает:) |
lesha 14 - 10.04.2004 - 19:04 | Только вот компиляторов поддерживающих экспорт шаблонов почти нету... вернее, насколько я знаю, таоке поддерживает только Комю |