Как на шаблонах реализовать аналог паттерна 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.
Здравствуйте, 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
Здравствуйте, Кодт, Вы писали:
...
Не — вы не совсем поняли (или я
). BaseA не знает какой тип. Тип скрыт в классе A. Что-то торможу, не понял ваш пример...
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Не — вы не совсем поняли (или я ). BaseA не знает какой тип. Тип скрыт в классе A. Что-то торможу, не понял ваш пример...
Если тип скрыт, то это полиморфизм времени исполнения.
Дальше, в зависимости от того, насколько богато множество возможных типов, нужно или паттерн-матчингом заниматься, или косвенные вызовы делать.
Посмотри, например, на boost::variant и функцию apply_visitor.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>