如何将参数传递给std :: bind到函数?

时间:2019-04-20 02:56:14

标签: c++ c++11

我有以下使用std :: bind的代码:

 EventListenerCustom* _createNewObjectlistener = 
eventDispatcher->addCustomEventListener(Constants::MY_EVENT, 
std::bind(&MyClass::MyFunction, this, std::placeholders::_1));

似乎我创建了许多不同种类的对象侦听器,其中唯一的区别是事件和被调用的函数。如果我想将上面的代码封装到一个函数中:

  • 我如何将MyClass :: MyFunction作为函数的参数传递?
  • 函数签名和参数是什么样的?

我想函数会看起来像这样:

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 *)>'

2 个答案:

答案 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。两者都应该有帮助。