当前位置:  开发笔记 > 编程语言 > 正文

如何使用std :: bind将函数与对象指针param绑定?

如何解决《如何使用std::bind将函数与对象指针param绑定?》经验,为你挑选了1个好方法。

以下是我的代码:

class A {};
class Test
{
public:
    template 
    Test(TClass* _objPointer, void(TClass::*_func)(A*))
    {
        mEventFunction = std::bind(_func, _objPointer);
    }
private:
    std::function mEventFunction;
};

class Demo
{
public:
    void BindFunc()
    {
        mTest = new Test(this, &Demo::testFunc);
    }
    void testFunc(A*)
    {

    }
private:
    Test* mTest;
};

我想要实现的是Demo类中的BindFunc().但是这段代码运行时出现了很多错误信息:错误C2672:'std :: invoke':找不到匹配的重载函数......



1> AndyG..:

您需要为尚未绑定std::placeholders::_1A*参数包含一个帐户:

#include 

class A {};
class Test
{
public:
    template 
    Test(TClass* _objPointer, void(TClass::*_func)(A*))
    {
        mEventFunction = std::bind(_func, _objPointer, std::placeholders::_1);
    }
private:
    std::function mEventFunction;
};

class Demo
{
public:
    void BindFunc()
    {
        mTest = new Test(this, &Demo::testFunc);
    }
    void testFunc(A*)
    {

    }
private:
    Test* mTest;
};

演示

A*如果我们使用lambda代替(Demo2),我认为你需要一些占位符会更清楚一点:

template 
Test(TClass* _objPointer, void(TClass::*_func)(A*))
{
    mEventFunction = [_objPointer, _func](A* _a){(_objPointer->*_func)(_a);};
}

lambda接受一个参数A*,这就是你想要的.实际上,我std::bind几乎在所有用例中都推荐使用lambda方法.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有