是否可以重新绑定std :: function以指向相同的函数,但使用不同的对象实例?将std :: function绑定到不同对象实例的相同函数
说如果我有一个对象具有绑定到另一个函数的std :: function,但是如果该对象被复制到另一个实例,我想重新将std :: function重新绑定到该新实例的旧例。
#include "stdafx.h"
#include <iostream>
#include <functional>
class EventHandler
{
public:
int Num;
std::function<int()> OnEvent;
EventHandler (int inNum)
{
Num = inNum;
}
EventHandler (const EventHandler& other)
{
Num = other.Num;
OnEvent = other.OnEvent; //TODO: Need some way to redirect the std::function to the new instance rather than having the delegate point to the original object's handler.
}
int HandleEvent()
{
return Num;
}
};
int main()
{
EventHandler a(4);
a.OnEvent = std::bind(&EventHandler::HandleEvent, a);
EventHandler b(a);
b.Num = 5;
//Uncommenting the line below is a manual way of redirecting event handler to the new instance.
//b.OnEvent = std::bind(&EventHandler::HandleEvent, b);
int aResult = a.OnEvent();
int bResult = b.OnEvent();
//This will print out 4 and 4 instead of 4 and 5 since b is still bound to a's event handler.
std::cout << "aResult=" << aResult << " bResult=" << bResult << '\n';
return 0;
}
我打算有一个std ::函数的包装来存储附加信息。
是问题怎么做这个事情具体,或者是如何让这个概念在代码中工作?我的意思是,还有其他方法可以正确获取EventHandler设置。例如,构造函数可以只是std :: bind(&EventHandler :: HandleEvent,this);.还有其他选择,但我不清楚你的目标。 – tmruss
更多关于如何让这个概念在代码中工作。我想我可能为了清晰起见而简化了这个例子。我正在使用的实际代码库与对象具有父子关系。当父母被复制时,其子女也被复制。我需要迁移孩子的std ::函数来指向新的实例,而不是指向原件。 –
让我先说这个,说我可能会尝试找到一种不同的方式来组织事情,然后用我将要说的来解决这个问题。这听起来像是一个设计问题,可能有一个更简单的解决方案。然而,你可以创建一个模板包装器,存储一个指向成员的指针,该指针将被绑定到函数中。然后,在您的赋值运算符中,您使用指向成员的指针作为目标,将“this”作为实例进行绑定。 做到这一点的唯一原因是,如果你试图使它通用。如果它总是相同的功能,我会重新绑定它。 – tmruss