如何将成员函数作为回调参数传递给需要`typedef-ed`自由函数指针的函数?

时间:2018-10-15 15:14:20

标签: c++ function-pointers member-function-pointers stdbind

let mean (x : float list) : float =
    (List.sum x) / (float (List.length x))

let variance (x : float list) : float =
    x
    |> List.map (fun a -> pown (a - (mean x)) 2)
    |> mean

let stdDev =
    variance >> Math.Sqrt

1 个答案:

答案 0 :(得分:2)

不可能有一个指向非静态成员函数的(非成员)函数指针。也不可能将函数指针指向绑定的函数。

请注意,自由函数类型如何具有参数void *cbdata。您尚未显示所用API的文档,但我想打赌该API遵循一个通用的习惯用法,mg_set_request_handler的第三个参数也是void *cbdata。如果我的假设是正确的,则传递给注册的指针将在稍后传递给处理程序。目的是将数据(例如您的HttpServer实例)传递到回调中。

例如:

mg_set_request_handler(ctx_, "/get", [](mg_connection *conn, void *cbdata) {
    assert(cbdata);
    HttpServer& server = *static_cast<HttpServer*>(cbdata);
    server.get_handler_member(conn, cbdata);
}, this);

如果get_handler_member具有非公共访问权限,那么您将需要使用静态成员函数,而不是我在示例中使用的lambda。另外,cbdata的{​​{1}}自变量现在可能已无用,可以删除。

请记住,只要注册了处理程序,get_handler_member实例就会保持活动状态。

还要重申一下:这取决于我对您显示的API的假设。请仔细查阅文档。