Я пытаюсь упростить (через make_fn()
) генерацию функторов, которые предварительно обрабатывают параметры (через wrap()
) для функций-членов с арностью n.
Генерация функторов в основном работает, но до сих пор только явное указание типов параметров для функции-члена.
Теперь я хотел бы сгенерировать правильный функтор из типа функции-члена, который он обрабатывает:
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
. У меня это работает с решением на основе макросов, но это решение требует явного указания типов и количества параметров.
Через разрешение перегрузки функции я надеюсь сгенерировать правильный функтор преобразования неявно из сигнатуры функции-члена.
make_fn(F f)
. Я не уверен, что это сработает: кажется, вы хотите создать шаблон из переменной указателя функции-члена во время выполнения. - person UncleBens   schedule 10.10.2009bool (X::*mp)(Y) = rand() % 2 ? &X::foo : &X::bar; make_fn(mp);
Чего именно вы ожидаете? - person UncleBens   schedule 10.10.2009bool (C::*)(T1)
. Насколько я понимаю, вы могли бы ожидать wrap‹T, Y, &T::foo› или wrap‹T, Y, &T::bar›, но как один и тот же оператор может создать другой тип из значения времени выполнения? - person UncleBens   schedule 11.10.2009