Генерация фанкор от типа указателя функции члена
Вопрос
Я пытаюсь упростить (через make_fn()
) генерация функторов, которые предварительно обрабатывают параметры (через wrap()
) для функций Arity -члена не.
Создание функционирования в основном работает, но до сих пор только путем явного указания типов параметров для функции элемента.
Теперь я хотел бы сгенерировать правильный функтор от типа функции члена, который он обрабатывает:
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
. Анкет У меня есть это работа с решением на основе макроса, но это решение требует явно указать типы и количество параметров.
Через разрешение перегрузки функции Я надеюсь, что я неявно сгенерировать правильный конвертирующий функтор из подписи функции члена.
Решение
Мне кажется, что вы пытаетесь превратить указатель, переданный на функцию в аргумент в отношении шаблона, не являющегося типом, который, я боюсь, не сработает (см. Комментарии к вашему вопросу).
Что вы могли бы сделать, это хранить указатель функции в функциональном объекте. Следующее представляет собой компиляцию:
#include <boost/bind.hpp>
#include <boost/function.hpp>
struct X {};
template <class T>
bool process(X) { return true; }
template <class C, class T1, class Func>
struct wrap1
{
typedef bool result_type;
Func f;
wrap1(Func f): f(f) {}
bool operator()(C* c, X x)
{
return (c->*f)(process<T1>(x));
}
};
template<class C, typename T1>
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(bool (C::*f)(T1))
{
return boost::bind(wrap1<C, T1, bool (C::*)(T1)>(f), _1, _2);
}
struct A
{
bool f1(bool) { return true; }
};
void test()
{
A a;
X x;
make_fn(&A::f1)(&a, x);
}
Тем не менее, я не уверен, что это хорошо и как вы создали бы остальные обертки. Для последнего вы можете просто получить компилятор, который поддерживает вариальные шаблоны. :)