К списку форумов К списку вопросов
template в С++
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
Только вот компиляторов поддерживающих экспорт шаблонов почти нету... вернее, насколько я знаю, таоке поддерживает только Комю

К списку вопросов на форуме Программирование

>>