генерация функтора по типу указателя на функцию-член
Я пытаюсь упростить (черезmake_fn()
) генерация функторов, которые препроцессируют параметры (черезwrap()
) для функций-членов arityn.
Генерация функторов в основном работает, но до сих пор только путем явного указания типов параметров для функции-члена.
Теперь я хотел бы сгенерировать правильный функтор из типа функции-члена, которую он обрабатывает:
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);
}
С этим, однако, vc ++ и g ++ не видятF
как тип для параметраmake_fn()
, Я должен пропустить что-то очевидное здесь и чувствую себя несколько слепым.
Идея состояла в том, что это должно работать так:
struct A
{
bool f1(bool) { return true; }
};
void test()
{
A a;
X x;
make_fn(&A::f1)(&a, x);
}
Есть идеи, как заставить это работать?
Фон:
У меня есть фиксированный интерфейс, который при упрощении выглядит следующим образом:
bool invoke(C* c, const char* const functionName, int argCount, X* args);
X - это вариант типа, который мне нужно преобразовать в определенные типы бэкэнда (int, std :: string, ...).
Для обработки этих вызовов у меня есть карта функторов, которые ищутся по имени, и сопоставляют эти вызовы с функциями-членами некоторого экземпляра.
Цель упаковки - избежать ручных преобразований и вместо этого генерировать функторы, которые выполняют преобразование для меня илиthrow
, Я работаю с решением на основе макросов, но это решение требует явного указания типов и количества параметров.
Через разрешение перегрузки функции я надеюсь генерировать правильный функтор преобразования неявно из сигнатуры функции-члена.