首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问静态restbed处理程序中的Class对象

访问静态restbed处理程序中的Class对象
EN

Stack Overflow用户
提问于 2021-05-16 23:01:40
回答 1查看 63关注 0票数 0

我目前正在熟悉一个项目的restbed,但在一开始就遇到了一个问题。我承认这可能是一件微不足道的事情,但在当时对我来说仍然是一个问题。

Restbed服务需要常量回调函数

代码语言:javascript
复制
void set_method_handler( const std::string& method, const std::function< void ( const std::shared_ptr< Session > ) >& callback );

问题是,我想创建一个REST服务来从类对象中获取一些数据。

标题

代码语言:javascript
复制
std::shared_ptr<restbed::Resource> REST_get_test;
static void get_test_handler(const std::shared_ptr< restbed::Session > session );

构造函数

代码语言:javascript
复制
REST_get_test = std::make_shared< restbed::Resource >( );
REST_get_test->set_path( "/test" );
REST_get_test->set_method_handler( "GET", get_test_handler);

我调用的处理程序应该遍历一个结构(代码还没有完成,但足以说明问题)

代码语言:javascript
复制
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" } } );
}

不出所料,我得到了一个:

代码语言:javascript
复制
error: invalid use of member 'project::c_module_home::cortexDrones' in static member function

有没有人有一个建议如何处理这个问题?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-05-27 07:46:40

长话短说。这不是一个非常微不足道的问题;至少解释了为什么它不能像预期的那样工作。

get_test_handler是类中的静态成员函数,它不能访问非静态属性。

如果get_test_handler是类中的非静态成员函数,则它不能作为回调函数,因为成员函数指针与“普通”函数指针不同。成员函数期望this指针作为第一个参数传递。这是由编译器自动完成的;这意味着函数签名不匹配。

在我第一次尝试做同样的事情(使用restbed)时,我的第一个想法是让处理程序成为静态的,但这迫使你让任何其他你可能从处理程序访问的东西也是静态的。在我看来,这不是一个解决方案。

在遇到同样的问题后,我找到的解决方案是将处理程序包装在一个lambda函数中;至少如果您使用的是C++11或更高版本的函数。

基于您的代码的简短示例:

代码语言:javascript
复制
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相比,它是一种更容易阅读的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67558184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档