我正在尝试简化(通过make_fn()
)预处理参数的函子的生成(通过wrap()
) 对于 arity 的成员函数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
。我使用基于宏的解决方案,但该解决方案需要明确指定类型和参数计数。
通过函数重载解析,我希望从成员函数签名隐式生成正确的转换函子。