Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Vinick, Вы писали:
V>>Получать и устанавливать тип от FunctionMap можно и по индексу....
V>>Т.е нужен такой хитрый compile-runtime полиморфизм.
К>Где же это compile-time, когда самый что ни на есть run-time.
Вобще-то я надеялся, что будет работать что-то типа такого
struct A {
void f() { std::cout << "A()" << std::endl; }
};
struct B {
void f() { std::cout << "B()" << std::endl; }
};
int main()
{
using namespace boost;
typedef mpl::map<mpl::pair<mpl::int_<0>,void> > map;
int i=1;
if( i ==1 )
{
typedef mpl::insert<map,mpl::pair <mpl::int_<1>, A> >::type map1;
}
else
typedef mpl::insert<map,mpl::pair <mpl::int_<1>,B> >::type map1;
typedef mpl::at<map1,mpl::int_<1> >::type S;
S s;
s.f();
return 0;
}
Но судя по всему такое невозможно.
К>Если бы тип аргумента (Circle) был известен заранее, до конструирования FunctorMap, — то проблем нет.
К>К>template<class T>
К>struct FunctorMap
К>{
К> function< void(*)(T&) > rotate;
К> function< void(*)(T&) > draw;
К>
Выяснить тип агрумента заранее можно. Так что видимо я воспользуюсь вашим вариантом.