gpt4 book ai didi

c++ - 如何使用 std::bind 将函数与对象指针参数绑定(bind)?

转载 作者:行者123 更新时间:2023-11-30 01:08:43 25 4
gpt4 key购买 nike

以下是我的代码:

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

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

}
private:
Test* mTest;
};

我想要实现的是Demo类中的BindFunc()。但是此代码运行时出现很多错误消息: error C2672: 'std::invoke': 找不到匹配的重载函数……

最佳答案

您需要包含一个 std::placeholders::_1考虑您尚未绑定(bind)的 A* 参数:

#include <functional>

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

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

}
private:
Test* mTest;
};

Demo

我认为如果我们改用 lambda ( Demo2 ),您需要一些 A* 的占位符会更清楚一些:

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

此处 lambda 接受 A* 的参数,这正是您想要的。实际上,在几乎所有用例中,我都推荐使用 lambda 方法而不是 std::bind

关于c++ - 如何使用 std::bind 将函数与对象指针参数绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41613576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com