C ++ Передача метода класса в качестве указателя на функцию - PullRequest
1 голос
/ 19 апреля 2020

У меня есть класс, который должен обрабатывать данные из разных файлов. Я думал о создании одной функции, которая будет читать указанный файл, а затем также принимать обратный вызов, чтобы он мог использовать это для обработки строки. Ниже приведен пример класса для представления того, что я пытаюсь сделать:

#include <iostream>
#include <vector>
#include <string>


class Example
{
    std::vector<std::string> m_exampleFileData {
        "test1",
        "test2",
        "test3"
    };

public:

    void doSomethingMain(const std::string& path)
    {        
        processFile(path, doSomething);
    }


private:    
    void processFile(const std::string& filePath, void (Example::*fpProcessLine)(const std::string&) )
    { 
        for (const auto& line : m_exampleFileData) {    
            this->*fpProcessLine(line);
        }
    }

    void doSomething(const std::string& line)
    {
        std::cout << "Hello: " << line << '\n';
    }

};


int main(int argc, char** argv) {    
    const std::string filePath{"path"};
    Example ex;

    ex.doSomethingMain(filePath);
}

Проводник компилятора: https://godbolt.org/z/LKoXSZ

Основная проблема заключается в том, что независимо от того, что я Не могу ли я, кажется, быть в состоянии передать функцию правильно processFile. Есть ли способ сделать это в C ++? Как я go об этом?

1 Ответ

4 голосов
/ 19 апреля 2020

В этой ситуации вам необходимо четко прописать следующее:

    processFile(path, &Example::doSomething);

Кроме того, вам также необходимо добавить лишнюю пару скобок из-за приоритета оператора:

         (this->*fpProcessLine)(line);
...