Для того, что бы пример запускался нужно достать библиотеку Loki Андрея Александреску (http://ru.wikipedia.org/wiki/Loki, http://sourceforge.net/projects/loki-lib).

#include "Functor.h"
#include <iostream>

struct Figure
{
virtual bool paint( int x, int y )=0;
};

struct Hexagon: public Figure
{
bool paint( int x, int y )
{
std::cout << "Hexagon";
return true;
}
};

template <class T>
void test( const T &figure )
{
if ( figure.paint( 0, 0 ) )
{
std::cout << " painted" << std::endl;
}
}

struct FigureOpt
{
typedef
Loki::Functor<bool, TYPELIST_2(int, int)>
PaintDelegate;

PaintDelegate paint;
};

struct HexagonOpt
{
operator FigureOpt()
{
FigureOpt instance;
instance.paint = FigureOpt::PaintDelegate(this, &HexagonOpt::paint);
return instance;
}

bool paint( int x, int y )
{
std::cout << "Hexagon";
}
};

int main()
{
test<Figure> (Hexagon() );
test<FigureOpt>(HexagonOpt());
return 0;
}

Решение показывает возможность как таковую. Что бы использовать такой подход в реальной жизни нужно будет продумать стратегию разделения данных между классами, которые будут разглядыватся в отношении базовый-дочерний, таковыми не являясь. Тут решения могут быть самыми разными: от декларации friend до распределителей памяти :).

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
          0 голосов

Один комментарий на “Моделирование виртуальных функций функторами”

  1. seagull сказал:

    Интересный вариант.
    Но меня лично смущает отсутствие наследования как такового. Плюс при таком подходе прийдется плодить "делегатов" для всех виртуальных функций.





Оставте свое мнение