我有以下使用std :: bind的代码:
EventListenerCustom* _createNewObjectlistener =
eventDispatcher->addCustomEventListener(Constants::MY_EVENT,
std::bind(&MyClass::MyFunction, this, std::placeholders::_1));
似乎我创建了许多不同种类的对象侦听器,其中唯一的区别是事件和被调用的函数。如果我想将上面的代码封装到一个函数中:
我想函数会看起来像这样:
EventListenerCustom* MyFunc(<What Goes Here> functionToBeBound,<What goes here> object,std::string EVENT){
EventListenerCustom* eventListener = eventDispatcher->addCustomEventListener(EVENT, std::bind(functionToBeBound, object, std::placeholders::_1));
return eventListener;
}
该函数应该是什么样的?我怎么称呼它?调用代码是什么样的?
编辑:具体细节:
我有许多以相同方式创建的侦听器对象:
auto eventDispatcher = _dragNode->getEventDispatcher();
_createNewObjectlistener = eventDispatcher->addCustomEventListener(Constants::MY_EVENT, std::bind(&MyClass::myOtherFunction, this, std::placeholders::_1));
_moveNewObjectlistener = eventDispatcher->addCustomEventListener(Constants::MY_EVENT2 std::bind(&MyClass::myFunction, this, std::placeholders::_1));
Constants :: MY_EVENT等只是const char *。
唯一的区别是调用了Function,并将字符串常量用作事件名称。如何将其封装到函数中?我在下面尝试了John Zwinck的解决方案,但是由于某种原因,由于编译器抱怨,我无法将其编译:
: No viable conversion from '__bind<void (*&)(cocos2d::EventCustom *), MyNameSpace::MyClass *, const std::__1::placeholders::__ph<1> &>' to 'const std::function<void (EventCustom *)>'
答案 0 :(得分:1)
为简化起见,请为指向MyClass
中具有适当签名的任何成员函数的指针创建一个typedef:
typedef void (MyClass::*MyMemberFn)(int); // replace int and void as needed
然后:
EventListenerCustom* MyFunc(MyMemberFn functionToBeBound, MyClass* object, std::string EVENT){
return eventDispatcher->addCustomEventListener(EVENT, std::bind(functionToBeBound, object, std::placeholders::_1));
}
答案 1 :(得分:-1)
您真正要寻找的是std::function
。这样的文档在这里:https://en.cppreference.com/w/cpp/utility/functional/function
他们的示例在解释其用法方面非常出色,但对于您的情况(或相关情况),请尝试以下操作:
std::function<void(int)> func1 = std::bind(MyClass::MyFunction, this, std::placeholders::_1));
这将创建一个可以调用的对象,并将第一个参数转发到成员函数的第一个参数,这两个参数均应为int
类型,并且不返回任何内容。您实际上不需要地址的运算符作为函数名称。
这里最酷的部分是std::bind
返回的对象可以传递到std::function
的构造函数中,并且保留其所有信息。因此,当您需要一个可以复制的具体类型以及所有很酷的东西(例如,不通过引用传递到函数中)时,请使用std::function
,因为只要不尝试复制,它就可以完成工作不可复制的类型。 std::function
也可以使用函数指针进行初始化。通常,它比C ++的函数指针“更好”,尤其是与std::bind
结合使用以处理类。
我可以写出更多示例,但请查看上面的链接,并在同一网站上查看std::bind
。两者都应该有帮助。