1

我正在围绕 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++ 还是很陌生,整个函数指针、处理程序和模板与我的实际理解有点不同。我阅读了有关绑定用法的信息,但所有示例都包括声明一个函数然后直接使用绑定。

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

4

2 回答 2

1

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

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

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

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

于 2013-06-21T12:01:34.533 回答
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);
}

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

谢谢大家的提示!

于 2013-06-25T11:26:19.873 回答