我有一个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_receiver
和Command ::m_function
内。 {1}}。
你知道我怎么能这样做吗?
非常感谢!