输入将在boost :: bind中使用的函数指针

时间:2013-06-21 11:49:42

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

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

这就是它现在的运作方式。某处有一个socket(m_client)类,它的set_handler函数就像下面的代码片段一样使用。

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 ++很陌生,整个函数指针,处理程序和模板对我的实际理解有所了解。我读到了绑定用法,但所有示例都包含声明一个函数,然后直接使用bind。

还搜索了一个类似的问题,但是如果它存在则没有找到它。我不会放弃我的方法不是最好的或完全错误的,所以欢迎所有的建议和建议。

2 个答案:

答案 0 :(得分:1)

提升正在使用模板 也许你应该尝试像

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

但是如果你想强迫用户提供某种功能,你可以检查模板专业化。

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

答案 1 :(得分:0)

好的,最后我按照我的期望让它发挥作用。解决方案非常简单,只是我在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);
}

这就是你如何传递一个函数作为另一个函数的参数。我的应用程序正在运行。

谢谢大家的提示!

相关问题