如何将非静态成员函数用于模板参数?

Dan*_*iel 2 c++ templates

我有这个最小的示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

对于回调函数,我想使用非静态类成员MyClass::ReadResult。在调用回调之前知道对象是否仍然有效(未破坏)也是很好的,因为否则我猜程序会失败。

我应该如何更改此代码才能将MyClass对象ReadResult用作回调?

Mik*_*l H 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;
  }
};
Run Code Online (Sandbox Code Playgroud)

  • @Daniel,您可以这样做:https://godbolt.org/z/feeMK6(但我不推荐它,语法不太好)。 (3认同)
  • `ReadResult` 需要一个参数。你试图用任何东西来调用它。 (2认同)