Одна из реализаций паттерна visitor:
проверено на компиляторе виз. студ.
файл 'visitor.h'
#pragma once
template <class V>
class visitor
{
public:
template <class T>
class action
{
protected:
typedef V V;
typedef T T;
public:
static void do_action(V & v, T & target);
};
template <class T>
void operator ()(T & target)
{
action<T>::do_action(*static_cast<V *>(this), target);
}
};
файл 'test_visitor.cpp'
#include "stdafx.h"
#include <iostream>
#include "visitor.h"
class some_visitor :
public visitor<some_visitor>
{};
class something
{};
void some_visitor::action<something>::do_action(V & v, T & target)
{
std::wcout << __FUNCTIONW__ << std::endl;
}
void test_visitor()
{
some_visitor v;
something target;
v(target);
}
Это упрощённый вариант, работает без виртуальности...