【问题标题】:Type for a function pointer that will be used in boost::bind类型为将在 boost::bind 中使用的函数指针
【发布时间】:2013-06-21 11:49:42
【问题描述】:

我正在围绕 websocket++ 库做一个消息传递库。这个库允许我设置自己的函数来管理消息。由于我没有做将使用我的代码的最终应用程序,因此我还需要允许我的用户为此处理程序设置他们想要的功能。

这就是它现在的工作方式。某个地方有一个 socket(m_client) 类,它有他的 set_handler 函数,它的使用类似于下面的 sn-p。

m_client.set_message_handler(bind(&myFunction,&m_client,_1,_2));

我想做的是提供一个函数,它将作为参数 &myFunction 以便用户调用如下:

my_class.set_msg_handler(&myFunction);

然后这就是声明:

void set_msg_handler(<type> myfunction){
    m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
}

但我无法弄清楚哪个是 myfunction 的正确类型以便使其编译。或者,即使这是存档的好方法。我查看了 boost 代码,看看是否能得到一些提示……但是当它结束使用模板时,那是我还没有管理的东西。

我知道让用户自己进行绑定并传递其输出可能会更简单,但 m_client 不能直接访问,我想保持这种方式以进行封装建议。我想现在这不是绝对必要的,也许有一天我会需要它。因此,在学习的建议中,我决定以任何方式提出。

对于这种级别的使用,我对 C++ 还是很陌生,整个函数指针、处理程序和模板都与我的实际理解有所不同。我阅读了有关绑定用法的信息,但所有示例都包括声明一个函数,然后直接使用绑定。

也搜索了一个类似的问题,但如果存在就没有找到。我不会否认我的方法不是最好的或完全错误的,因此欢迎所有建议和建议。

【问题讨论】:

    标签: c++ boost boost-bind websocket++


    【解决方案1】:

    boost 正在使用模板 也许你应该尝试类似

    template <typename T>
    void set_msg_handler(T myfunction){
        m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
    }
    

    但如果您想强制用户提供某种功能,您可以检查模板特化。

    但是 bind 几乎可以接受任何类型的指针。

    【讨论】:

    • 嗯,但这并不能解决我不知道 T 是什么的问题...对于一件愚蠢的事情来说,这可能是一个过于复杂的问题......
    • 来自 cplusplus.com:当编译器遇到这个对模板函数的调用时,它会使用模板自动生成一个函数,将 T 的每个出现替换为作为实际模板参数传递的类型,然后调用它。此过程由编译器自动执行,程序员不可见。当您查看 bind 的定义时,它是一个模板函数。但是,如果您想指定函数的类型是函数的基本指针,例如:void (ptr)()
    • 是的,我刚刚发现它并试图让它工作。谢谢......关于我的最后评论......
    【解决方案2】:

    好的,最后我让它按预期工作。解决方法很简单,就是我c++经验的一个问题。

    首先,在将执行最终绑定的类的标题中,我声明了一个类型,该类型声明了一个函数指针,其结构是 message_handler 必须具有的。在 oder 类中定义包装方法会很容易:

    typedef void (*msg_handler_ptr)(client*,connection_hdl,message_ptr);
    

    我花了一些时间来获得正确的声明......一旦完成,我已经在相应的类中声明了将执行绑定的函数:

     void set_msg_handler(msg_handler_ptr myfunction){
        using websocketpp::lib::placeholders::_1;
        using websocketpp::lib::placeholders::_2;
        using websocketpp::lib::bind;
        m_client.set_message_handler(bind(myfunction,&m_client,::_1,::_2));
    } 
    

    在我的控制器类上最后一个包装器:

    #include "mysocket_class.h"
    void mycontroller::set_msg_handler(msg_handler_ptr myfunction)
    {
        c.set_msg_handler(myfunction);
    }
    

    无论我想在哪里声明我真正的 msg_handler,它都非常简单,它只会将收到的内容发送到标准输出:

    void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) 
    {
        client::connection_ptr con = c->get_con_from_hdl(hdl);
        std::cout << "Recived " << msg->get_payload() << std::endl;
    }
    
    int main(int argc, char* argv[]) {
        mycontroller c();
        c.set_msg_handler(&on_message);
    }
    

    这就是您将函数作为另一个函数的参数传递的方式。我的应用程序正在运行。

    谢谢大家的提示!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2013-10-06
      • 1970-01-01
      • 2012-10-25
      • 2016-09-06
      • 1970-01-01
      相关资源
      最近更新 更多