Я должен хранить список различных boost :: function объектов.Чтобы обеспечить это, я использую boost :: any.У меня есть несколько функций, которые принимают сигнатуры различных функций, упаковывают их в any и затем вставляют в специальную карту с заданным типом.Вот код:
enum TypeEnumerator
{
e_int,
e_float,
e_double
};
typedef map< string, pair<any, TypeEnumerator> > CallbackType;
CallbackType mCallbacks;
void Foo(const string &name, function<float ()> f)
{
mCallbacks[name] = make_pair(any(f), CLASS::e_float);
}
void Foo(const string &name, function<int ()> f) { /* the same, but with e_int */ }
void Foo(const string &name, function<double ()> f) { /* the same, but with e_double */ }
Теперь у меня есть функция повышения карты, упакованная в любой с заданным типом из enum, чтобы распознать его в будущем.Теперь я должен вызывать данные функции.Приведение из любого не будет работать:
BOOST_FOREACH(CallbackType::value_type &row, mCallbacks)
{
// pair<any, TypeEnumerator>
switch (row.second.second) // Swith the TypeEnumerator
{
case 0: // int
any_cast< function<int ()> >(row.first)();
break;
case 1: // float
any_cast< function<float ()> >(row.first)();
break;
case 2: // double
any_cast< function<double ()> >(row.first)();
break;
}
}
Это не будет кастовать, и во время бега я получаю исключение:
what(): boost::bad_any_cast: failed conversion using boost::any_cast
Возможно ли преобразовать обратно boost :: function объект?