C ++ настройка функции обратного вызова

0

Я работаю над программой, которая запускает пользовательский веб-сервер, который должен выводить некоторый активный HTML-контент:

// This is the webserver library...
class myWebServer
{
public:
    myWebServer() {}
    ~myWebServer() {}

    // ...

    void sendPageToClient()
    {
        // ... "client" is the TCP socket
        // ... "html" should contain the output of myMainProgram::ProcessASP

        client->send(html);
    }

    void runServer()
    {
        while (1)
        {
            // listens to TCP socket
            client->listen();

            // receive query from browser
            // send HTML using sendPageToClient()
            // ...
            sendPageToClient();
        }
    }
};


// This is the main program class...
class myMainProgram
{
public:
    myMainProgram() {}
    ~myMainProgram() {}

    // ...

    string ProcessASP(string query)
    {
        return
        "<html>The query string you have passed contains:<br>"
        + query +
        "</html>";
    }

    void runProgram()
    {
        // do something
    }
};


// This is a multi-threaded application
void main()
{
    myMainProgram   myProgram;
    myWebServer myServer;

    myProgram.runProgram();
    myServer.runServer();
};

Как настроить функцию обратного вызова, которая из класса myWebServer вызывает параметры myMainProgram::ProcessASP и получает их вывод?

  • 0
    Возможно, вы захотите прочитать о Boost ASIO .
Теги:
callback

1 ответ

2
Лучший ответ

Вероятно, вы захотите использовать std::function<std::string(std::string)>:

class myWebServer {
    // not really a "callback"?
    std::function<std::string(std::string)> callback;

public:
    template <typename F>
    void setCallback(F&& f) { callback = std::forward<F>(f); }

    void runServer() {
      // ...
      std::string foo = callback("hello");
      // do something with foo
    }
};

И тогда вы можете сделать:

myServer.setCallback([&](std::string query){
    return myProgram.ProcessASP(query);
});
  • 0
    Да, это действительно работает! Не могли бы вы объяснить, почему вы говорите, что на самом деле это не обратный вызов?
  • 0
    @MarkMiles Я думаю о обратном вызове как о «хорошо, у меня есть некоторые данные, теперь вы идете с этим что-то делать». Это скорее «я должен у тебя кое о чем спросить», так что это не совсем то же самое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню