我有这个最小的示例代码:
#include <functional>
#include <iostream>
#include <vector>
template<class ReadFileCallback>
void fileMgr_ReadWithCallback(std::string filename, ReadFileCallback callback) {
callback("OK");
}
void globalReadResult(std::string result) {
std::cout << "ReadResult in global function: result=" << result << std::endl;
}
class MyClass {
public:
MyClass() {};
~MyClass() {};
void Read() {
fileMgr_ReadWithCallback("file", globalReadResult);
//fileMgr_ReadWithCallback("file", this->ReadResult);
}
void ReadResult(std::string result) {
std::cout << "ReadResult in member function: result=" << result << std::endl;
}
};
int main()
{
MyClass c;
c.Read();
return 0;
}
对于回调函数,我想使用一个非静态的类成员MyClass::ReadResult
。最好在调用回调之前知道对象是否仍然有效(未破坏),因为我猜该程序会失败。
如何更改此代码以能够将MyClass
对象的ReadResult
用作回调?
答案 0 :(得分:6)
您可以将其包装为lambda:
class MyClass {
public:
MyClass() {};
~MyClass() {};
void Read() {
fileMgr_ReadWithCallback("file", [this](const std::string& result){ this->ReadResult(result); });
}
void ReadResult(std::string result) {
std::cout << "ReadResult in member function: result=" << result << std::endl;
}
};
答案 1 :(得分:0)
您可以使用std :: bind。
#include <functional>
#include <iostream>
#include <vector>
#include <functional>
template<class ReadFileCallback>
void fileMgr_ReadWithCallback(std::string filename, ReadFileCallback callback) {
callback("OK");
}
void globalReadResult(std::string result) {
std::cout << "ReadResult in global function: result=" << result << std::endl;
}
class MyClass {
public:
MyClass() {};
~MyClass() {};
void Read() {
using std::placeholders::_1;
//std::function<void(std::string)> func = std::bind( &MyClass::ReadResult, this, _1);
auto func = std::bind( &MyClass::ReadResult, this, _1);
fileMgr_ReadWithCallback("file", func);
//
// or
// fileMgr_ReadWithCallback("file", std::bind( &MyClass::ReadResult, this, _1));
}
void ReadResult(std::string result) {
std::cout << "ReadResult in member function: result=" << result << std::endl;
}
};
int main()
{
MyClass c;
c.Read();
return 0;
}