我有一个函数,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();
}
谢谢。抱歉帖子太长了。