さまざまなboost::functionオブジェクトのリストを保存する必要があります。これを提供するために、私はboost::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 */ }
今、私はマップブースト機能を持っており、将来それを認識するために、列挙型から与えられたタイプの任意のものにパックされています。次に、指定された関数を呼び出す必要があります。いずれからのキャストも機能しません:
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オブジェクトを元に戻すことは可能ですか?