我正在围绕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。
还搜索了一个类似的问题,但是如果它存在则没有找到它。我不会放弃我的方法不是最好的或完全错误的,所以欢迎所有的建议和建议。
答案 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);
}
这就是你如何传递一个函数作为另一个函数的参数。我的应用程序正在运行。
谢谢大家的提示!