Здравствуйте, Vinick, Вы писали:
V>Получать и устанавливать тип от FunctionMap можно и по индексу....
V>Т.е нужен такой хитрый compile-runtime полиморфизм.
Где же это compile-time, когда самый что ни на есть run-time.
Такой полиморфизм можно сделать или через виртуальные методы, или через указатели на функции (или, более общо, boost::function).
Но здесь таится другая засада. Тебе нужен не просто полиморфизм, но мультиметоды. Ведь, как я понимаю, FunctorMap должна реализовать шаблон оператора, применяющий все эти полиморфные действия к произвольному типу.
Если бы тип аргумента (Circle) был известен заранее, до конструирования FunctorMap, — то проблем нет.
template<class T>
struct FunctorMap
{
function< void(*)(T&) > rotate;
function< void(*)(T&) > draw;
template< template<class> class F > void set_rotate() { rotate = function( F<T>() ); }
template< template<class> class F > void set_draw() { draw = function( F<T>() ); }
void operator()(T& obj) { rotate(obj); draw(obj); }
};
main()
{
FunctorMap<Circle> fm;
fm.set_rotate<rotate_clockwise>();
fm.set_draw<draw_crt>();
}
А ещё можно пойти функциональным путем
template<template<class>class R, template<class>class D, class T> void doit()
{
R<T> r;
D<T> d;
T t;
r(t); d(t);
}
template<template<class>class R, template<class>class D> void parse_arg3(char** args)
{
switch(atoi(args[3]))
{
case 1: doit<R,D,Circle>(); break;
case 2: doit<R,D,Square>(); break;
...
}
}
template<template<class>class R> void parse_arg2(char** args)
{
switch(atoi(args[2]))
{
case 1: parse_arg3<R,draw_on_crt>(args); break;
case 2: parse_arg3<R,draw_on_ptinter>(args); break;
...
}
}
void parse_arg1(char** args)
{
switch(atoi(args[1]))
{
case 1: parse_arg2<rotate_clockwise>(args); break;
case 2: parse_arg2<rotate_counterlockwise>(args); break;
...
}
}
Возможно, что как-то попробовать завернуть кортеж типов в mpl_vector...
... << RSDN@Home 1.2.0 alpha rev. 655>>