Шаблонный Visitor
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:54
Оценка:
Как на шаблонах реализовать аналог паттерна Visitor?
Код примерно такой:

template<typename TYPE>
class A : public BaseA
{
// ...
TYPE m_value;
};

// BaseA - нешаблонный класс

class BaseA
{
// ...
void Visit(C& cClass);
// ...
};

class C
{
// ...
template<typename TYPE>
void Callback(const TYPE& value);
// ...
};


Хотелось бы через метод метод Visit класса BaseA вызывать шаблонный метод Callback класса C.
Re: Шаблонный Visitor
От: Кодт Россия  
Дата: 03.11.09 01:44
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Хотелось бы через метод метод Visit класса BaseA вызывать шаблонный метод Callback класса C.


Ну раз метод Visit принимает полиморфный объект — делай его шаблоном.
class BaseA
{
  template<class TC> // требование к TC - у него должен быть метод Callback(_)
  void Visit(TC& c)
  {
    .....
    c.Callback(*this);
    .....
  }
};

class C
{
  template<class TA>
  void Callback(TA& a)
  {
    .....
    a.Visit(*this); // пущай они в пинг-понг сыграют :)
    .....
  }
};


А если нужен полиморфизм времени исполнения — тут уж, как ни крути, без косвенных вызовов никуда. Будь то виртуальные методы, указатели на функции или замыкания типа boost::function
Перекуём баги на фичи!
Re[2]: Шаблонный Visitor
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 03.11.09 08:11
Оценка:
Здравствуйте, Кодт, Вы писали:

...


Не — вы не совсем поняли (или я ). BaseA не знает какой тип. Тип скрыт в классе A. Что-то торможу, не понял ваш пример...
Re[3]: Шаблонный Visitor
От: Кодт Россия  
Дата: 04.11.09 12:47
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Не — вы не совсем поняли (или я ). BaseA не знает какой тип. Тип скрыт в классе A. Что-то торможу, не понял ваш пример...


Если тип скрыт, то это полиморфизм времени исполнения.
Дальше, в зависимости от того, насколько богато множество возможных типов, нужно или паттерн-матчингом заниматься, или косвенные вызовы делать.
Посмотри, например, на boost::variant и функцию apply_visitor.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.