Re: структура из типов
От: Кодт Россия  
Дата: 28.09.06 09:18
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.