从std :: function(std :: bind)获取函数和对象指针

时间:2013-12-26 13:48:31

标签: c++ templates stl

我有一个Command模板,它足够通用,可存储指向类T对象的指针,以及此类T的成员函数指针:

template<typename T>
class Command : public CommandBase
{
public:

    typedef void (T::*MemFn)();

    Command(MemFn fun, T* receiver) :
        CommandBase(),
        MemFn(fun),
        m_receiver(receiver)
    {

    }

    void execute() const override {(m_receiver->*m_function)();}

protected:

    T* m_receiver;
    MemFn m_function;

};

这些Command对象由类Property的实例执行,这里没什么复杂的。

到目前为止,我的Commands已在Property之外进行了实例化:使用Command函数向Property提供了指向Property::register()的指针Commands删除了Property。那是Commands由不同的类创建和删除:作为一种设计并不是真正干净。

为了清理,我希望Property同时创建和删除Commands。所以我想在寄存器函数的参数中提供指向接收器和成员函数的指针。为了避免耦合,我希望Property不知道接收器的类型,所以我考虑将接收器和成员函数的指针提供给std :: function(std :: bind()) ,所以我的财产看起来像:

class Property
{
public:
    typedef boost::function<void ()> MemFnWrapper;

    bool register(MemFnWrapper memFnWrapper);

...
}

进行注册的代码如下:

Property myProp;
myProp->register(boost::bind(&myMemberFunction, this));

请注意,此注册过程在类ConcreteNode的对象中完成,该对象是模板Command中名为T的类型。 ConcreteNode定义函数myMemberFunction

这一切都非常好。现在我的问题是:我在Property::register()的定义中加入了什么?在register中,我需要从接收者(this)和成员函数中获取指针以调用(myMemberFunction),以便将它们存储在Command ::m_receiverCommand ::m_function内。 {1}}。

你知道我怎么能这样做吗?

非常感谢!

0 个答案:

没有答案