generowanie funktora z typu wskaźnika funkcji członka
Próbuję uprościć (przezmake_fn()
) generowanie funktorów, które przetwarzają parametry (przezwrap()
) dla funkcji członka arityn.
Generowanie funktorów w zasadzie działa, ale do tej pory tylko przez jawne określenie typów parametrów dla funkcji składowej.
Teraz chciałbym wygenerować poprawny funktor z obsługiwanego typu funkcji członka:
struct X {};
template<class C, typename T1, bool (C::*F)(T1)>
inline // there are more for T1..TN
bool wrap(C* c, X x)
{
return (c->*F)(process<T1>(x));
}
template<class C, typename T1, bool (C::*F)(T1)>
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(F f) // <- problem here, F is not a type
{
return boost::bind(&wrap<C, T1, F>, _1, _2);
}
Z tym jednak vc ++ i g ++ nie widząF
jako typ parametrumake_fn()
. Muszę tęsknić za czymś oczywistym i czuję się nieco ślepy.
Pomysł polegał na tym, że powinien działać tak:
struct A
{
bool f1(bool) { return true; }
};
void test()
{
A a;
X x;
make_fn(&A::f1)(&a, x);
}
Jakieś pomysły, jak to zrobić?
Tło:
Mam stały interfejs, który po uproszczeniu wygląda tak:
bool invoke(C* c, const char* const functionName, int argCount, X* args);
X jest typem wariantu, który muszę przekonwertować na pewne typy zaplecza (int, std :: string, ...).
Aby obsłużyć te wywołania, mam mapę funktorów, które są wyszukiwane według nazwy i mapują te wywołania na funkcje składowe niektórych instancji.
Celem owijania jest uniknięcie ręcznych konwersji i zamiast tego generowanie funktorów, które wykonują konwersję dla mnie lubthrow
. Pracuję z rozwiązaniem opartym na makro, ale to rozwiązanie wymaga jawnego określenia typów i liczby parametrów.
Mam nadzieję, że dzięki rozdzielczości przeciążenia funkcji wygeneruję prawidłowy funktor konwertujący niejawnie z podpisu funkcji składowej.