从成员函数指针型仿函数代(functor generation from member functi

2019-08-17 17:28发布

我试图简化(经由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 。 我有这个工作与基于宏观的解决方案,但解决方案需要指定类型和参数计算明确。
通过函数重载我希望从成员函数签名隐含生成正确的转换函子。

Answer 1:

在我看来,你正试图把传递给函数的指针到非类型模板参数,这恐怕是行不通的(见注释你的问题)。

你可以做什么,是将函数指针存储在一个函数对象。 下面似乎编译:

#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);
}

不过,我不知道这是什么好和你将如何创建包装的其余部分。 对于后者,你可能只是得到支持可变参数模板的编译器。 :)



文章来源: functor generation from member function pointer type