c++ - 是否可以将成员函数指针从 std::bind 更改为 lambda?
问题描述
std::function
我用, 编写了回调方法 std::bind
。
std::function
A 类中的对象 func1
指向 bFoo(int, int)
B 类成员的函数。
我的程序中的回调代码:
// Class A - A.h
class A
{
public:
template<class T>
void setCallback(T *pClass, void(T::*pFunc)(int, int));
private:
std::function<void(int, int)> func1;
}
template<class T>
inline void A::setCallback(T *pClass, void(T::*pFunc)(int, int))
{
func1 = std::bind(pFunc, pClass, std::placeholders::_1, std::placeholders::_2);
}
// Class A - A.cpp
...
func1(x,y);
...
// Class B - B.h
class B
{
public:
void bFoo(int x, int y);
private:
A a; // instance of class A
}
// Class B - B.cpp
B::B()
{
a.setCallback(this, &B::bFoo);
}
它工作正常。
但是,听说在 C++ 14 及更高版本中,std::bind
完全可以用 lambda 代替,而且 lambda 比std::bind
.
所以我尝试将绑定更改为 lambda 并查找了许多示例,但就我而言,我还没有找到如何将绑定替换为 lambda。
我想将另一个类的成员函数分配给std::function
使用 lambda,而不是std::bind
.
这可能吗?
解决方案
可以通过使用您当前的代码来做到这一点
func1 = [=](int x, int y){ (pClass->*pFunc)(x,y); };
在我看来,最好在调用站点上写出 lambda。为此,您需要修改setCallback
.
class A
{
public:
template<class T>
void setCallback(T callback);
private:
std::function<void(int, int)> func1;
}
template<class T>
inline void A::setCallback(T callback)
{
func1 = callback;
}
然后我们可以B
使用 lambda 调用 from 构造函数。
class B
{
public:
void bFoo(int x, int y);
private:
A a; // instance of class A
}
// Class B - B.cpp
B::B()
{
a.setCallback([&](int x, int y){ bFoo(x, y); }); // & will capture this
}
推荐阅读
- swiftui - 如何显示由 JSON 数据导入的图像
- visual-studio - VSCT 菜单项未显示
- java - 如何将多个活动锁定为纵向?
- java - java firebase-admin 无法登录用户并获取令牌没有客户端
- sql - 我正在尝试在一个表中生成一个列,其中包含另一个表中的行数
- c# - 将 Mosquitto 消息插入 dataGridView
- java - 允许用户输入字符串和整数
- keras - Keras conv2D 输入形状错误。检查输入时出错:预期 conv2d_4_input 有 4 个维度,但得到了形状为 (58, 195, 1) 的数组
- javascript - 如何防止 refetchEvents() 切换到当前日/周/月?
- pdf - 从 ASP.NET WEB API 获取字节数组以使用 React/Redux 呈现为 PDF