我目前正在熟悉一个项目的restbed,但在一开始就遇到了一个问题。我承认这可能是一件微不足道的事情,但在当时对我来说仍然是一个问题。
Restbed服务需要常量回调函数
void set_method_handler( const std::string& method, const std::function< void ( const std::shared_ptr< Session > ) >& callback );问题是,我想创建一个REST服务来从类对象中获取一些数据。
标题
std::shared_ptr<restbed::Resource> REST_get_test;
static void get_test_handler(const std::shared_ptr< restbed::Session > session );构造函数
REST_get_test = std::make_shared< restbed::Resource >( );
REST_get_test->set_path( "/test" );
REST_get_test->set_method_handler( "GET", get_test_handler);我调用的处理程序应该遍历一个结构(代码还没有完成,但足以说明问题)
void c_module_home::get_test_handler( const std::shared_ptr< restbed::Session > session )
{
QJsonObject status;
for (auto iter = cortexDrones.begin(); iter!= cortexDrones.end(); ++iter){
}
session->close( restbed::OK, "Hello, World!", { { "Content-Length", "13" }, { "Connection", "close" } } );
}不出所料,我得到了一个:
error: invalid use of member 'project::c_module_home::cortexDrones' in static member function有没有人有一个建议如何处理这个问题?非常感谢!
发布于 2021-05-27 07:46:40
长话短说。这不是一个非常微不足道的问题;至少解释了为什么它不能像预期的那样工作。
get_test_handler是类中的静态成员函数,它不能访问非静态属性。
如果get_test_handler是类中的非静态成员函数,则它不能作为回调函数,因为成员函数指针与“普通”函数指针不同。成员函数期望this指针作为第一个参数传递。这是由编译器自动完成的;这意味着函数签名不匹配。
在我第一次尝试做同样的事情(使用restbed)时,我的第一个想法是让处理程序成为静态的,但这迫使你让任何其他你可能从处理程序访问的东西也是静态的。在我看来,这不是一个解决方案。
在遇到同样的问题后,我找到的解决方案是将处理程序包装在一个lambda函数中;至少如果您使用的是C++11或更高版本的函数。
基于您的代码的简短示例:
resource->set_method_handler("GET",
[&](const std::shared_ptr<restbed::Session> session) {
get_test_handler(session);
});这里的要点不是要得到lambda是std::function的概念;它是一种未指定的类型,可以分配给std::function(当然,类型必须匹配)。
您可以在以下链接中找到更多详细信息:
https://en.cppreference.com/w/cpp/language/lambda
https://shaharmike.com/cpp/lambdas-and-functions/
更新:
我找到了这个链接,在我看来,它描述了最好的C++ lambdas:https://www.cprogramming.com/c++11/c++11-lambda-closures.html,与cppreference.com相比,它是一种更容易阅读的方式。
https://stackoverflow.com/questions/67558184
复制相似问题