提问者:小点点

如何使用非静态成员函数作为模板参数?


我有以下最小的示例代码:

#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作为回调?


共2个答案

匿名用户

您可以将其包装成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;
  }
};

匿名用户

您可以使用std::函数。 这是一个很好的解决办法:

#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);

            fileMgr_ReadWithCallback("file", func);
        }  

        void ReadResult(std::string result) {
            std::cout << "ReadResult in member function: result=" << result << std::endl;
        }  
};

int main()
{
    MyClass c; 
    c.Read();


    return 0; 
}