Для того, что бы пример запускался нужно достать библиотеку 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 до распределителей памяти :).



декабря 15, 2006 в 6:30 pm
Интересный вариант.
Но меня лично смущает отсутствие наследования как такового. Плюс при таком подходе прийдется плодить "делегатов" для всех виртуальных функций.