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

时间:2020-07-21 15:01:07

标签: 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;
}

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

如何更改此代码以能够将MyClass对象的ReadResult用作回调?

2 个答案:

答案 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; 
}

相关问题