У меня есть функция Post()
, которая принимает два аргумента - путь std::string
для прослушивания запросов и std::function<void(Request &, Response &)>
для обработки входящего запроса.Обратите внимание, что я не могу изменить Post()
.
Например:
m_server.Post("/wallet/open", [this](auto req, auto res)
{
std::cout << req.body << std::endl;
}
Я пытаюсь передать запрос через функцию промежуточного программного обеспечения, а затем перейти к функции обработчика.,
Функция обработчика и функция промежуточного программного обеспечения являются функциями-членами.Настройка привязки Post () происходит внутри функции-члена того же класса.
Это работает:
m_server.Post("/wallet/open", [this](auto req, auto res){
auto f = std::bind(&ApiDispatcher::openWallet, this, _1, _2);
middleware(req, res, f);
});
Однако я подключаю разумное количество запросов,и было бы неплохо абстрагировать это в функцию, поэтому мы можем просто вызвать, например,
m_server.Post("/wallet/open", router(openWallet));
Мне удалось получить что-то подобное, но я не могу понять,Как заставить это работать при использовании функций-членов.Это прекрасно работает, если все является бесплатной функцией:
const auto router = [](auto function)
{
return std::bind(middleware, _1, _2, function);
};
m_server.Post("/wallet/open", router(openWallet))
.Post("/wallet/keyimport", router(keyImportWallet))
.Post("/wallet/seedimport", router(seedImportWallet))
.Post("/wallet/viewkeyimport", router(importViewWallet))
.Post("/wallet/create", router(createWallet))
Однако моя попытка заставить ее работать для функций-членов не работает, и я не могу понять, что говорит мне сообщение об ошибке.:
const auto router = [](auto function)
{
return std::bind(&ApiDispatcher::middleware, _1, _2, function);
};
m_server.Post("/wallet/open", router(&ApiDispatcher::openWallet))
.Post("/wallet/keyimport", router(&ApiDispatcher::keyImportWallet))
.Post("/wallet/seedimport", router(&ApiDispatcher::seedImportWallet))
.Post("/wallet/viewkeyimport", router(&ApiDispatcher::importViewWallet))
.Post("/wallet/create", router(&ApiDispatcher::createWallet))
Функция роутера сама по себе работает.Я думаю, проблема в том, что я не вызываю функции обработчика на this
.Я попытался сделать это вместо этого:
m_server.Post("/wallet/open", router(std::bind(&ApiDispatcher::openWallet, this, _1, _2)));
Но затем я получаю сообщение об ошибке "Неверное количество аргументов для указателя на член".
Вот минимальный пример для репликации проблемы:
#include <iostream>
#include <string>
#include <functional>
using namespace std::placeholders;
class ApiDispatcher
{
public:
void middleware(std::string req, std::string res, std::function<void(std::string req, std::string res)> handler)
{
// do some processing
handler(req + " - from the middleware", res);
}
void dispatch()
{
const auto router = [](auto function)
{
return std::bind(&ApiDispatcher::middleware, _1, _2, function);
};
/* Uncommenting this line breaks compilation */
// Post("/wallet/open", router(&ApiDispatcher::openWallet));
}
void openWallet(std::string req, std::string res)
{
std::cout << req << std::endl;
}
void Post(std::string method, std::function<void(std::string req, std::string res)> f)
{
// wait for a http request
f("request", "response");
}
};
int main()
{
ApiDispatcher server;
server.dispatch();
}
Спасибо.Извините, пост был таким длинным.