я использую доработанную версию с виртуальностью.
типа такого:
class part_visitor :
public _visitor<part_visitor>
{};
class spell_checker :
public part_visitor::visitor<spell_checker>
{
public:
wchar_t * h_mem;
// другие св-ва
};
class part :
virtual public part_visitor::_is_visitable
{
protected:
virtual ~part() = 0;
};
class some_part1 :
public part_visitor::is_visitable<some_part1>
{};
template <>
template <>
template <>
void spell_checker::action<some_part1>::do_action(T & target)
{
// конкретная реализация действия
}
void test()
{
part_visitor * hv= new spell_checker(/*параметры*/);
part * hp= new some_part1;
hp->visit(hv);
// удаление hv, hp не забыть!
}
Имена, начинающиеся со знака '_' (с подчёркивания)
это имена интерфейсов.