【问题标题】:Access a Class Object inside a static restbed handler访问静态休息床处理程序中的类对象
【发布时间】:2021-05-16 15:01:40
【问题描述】:

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

Restbed 服务需要一个 const 回调函数

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

有没有人建议如何处理?非常感谢!!

【问题讨论】:

  • 你查看过 std::bind 吗?

标签: c++ static restbed


【解决方案1】:

长话短说……这不是一个非常微不足道的问题;至少是为什么它没有按预期工作背后的答案。

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++ lambda:https://www.cprogramming.com/c++11/c++11-lambda-closures.html,与 cppreference.com 相比,它更容易阅读。

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多