是否可以将成员函数指针从 std::bind 更改为 lambda?
Is it possible to change the member function pointer from std::bind to lambda?
我用 std::function
、std::bind
.
编写回调方法
std::function
class 中的对象 func1
A 指向函数 bFoo(int, int)
,它是 class 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。
我想使用 lambda 将另一个 class 的成员函数分配给 std::function
,而不是 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;
}
然后我们可以使用 lambda 从 B
的构造函数中调用。
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
}
简而言之,
struct A {
using Callback = std::function<void(int, int)>;
void setCallback(Callback cb) { func1 = std::move(cb); }
};
B::B() { a.SetCallback([this](int x, int y) { bFoo(x, y); }); }
您应该捕获 this
以将方法绑定到对象。
std::bind
应该没什么问题,除非你供职于一家有自己独特观念的知名公司。
我用 std::function
、std::bind
.
std::function
class 中的对象 func1
A 指向函数 bFoo(int, int)
,它是 class 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。
我想使用 lambda 将另一个 class 的成员函数分配给 std::function
,而不是 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;
}
然后我们可以使用 lambda 从 B
的构造函数中调用。
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
}
简而言之,
struct A {
using Callback = std::function<void(int, int)>;
void setCallback(Callback cb) { func1 = std::move(cb); }
};
B::B() { a.SetCallback([this](int x, int y) { bFoo(x, y); }); }
您应该捕获 this
以将方法绑定到对象。
std::bind
应该没什么问题,除非你供职于一家有自己独特观念的知名公司。