首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将在boost::bind中使用的函数指针的类型

将在boost::bind中使用的函数指针的类型
EN

Stack Overflow用户
提问于 2013-06-21 19:49:42
回答 2查看 185关注 0票数 1

我正在围绕websocket++库做一个消息库。这个库允许我设置自己的函数来管理消息。因为我不是在做将使用我的代码的最终应用程序,所以我还需要允许我的用户为这个处理程序设置他们想要的函数。

这就是它现在的工作方式。在某个地方有一个socket(m_client)类,它有一个set_handler函数,它的用法类似于下面的代码片段。

代码语言:javascript
运行
复制
m_client.set_message_handler(bind(&myFunction,&m_client,_1,_2));

我想要做的是提供一个函数,它将作为参数&myFunction,所以用户只需调用如下代码:

代码语言:javascript
运行
复制
my_class.set_msg_handler(&myFunction);

然后这将是一个声明:

代码语言:javascript
运行
复制
void set_msg_handler(<type> myfunction){
    m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
}

但我不能明确哪个是myfunction的正确类型,以便让它进行编译。或者这是否是一个很好的归档方法。我看了下boost代码看看能不能得到一些提示...但是当它结束与模板的工作时,这是我还没有管理的东西。

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

对于这种级别的用法,我在C++上还是个新手,整个函数指针、处理程序和模板在我的实际理解中略显逊色。我读过关于bind用法的文章,但是所有的例子都是关于声明一个函数,然后直接使用bind。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-25 19:26:20

好了,我终于让它像我期望的那样工作了。解决方案非常简单,只是一个关于我在c++中的经验的问题。

首先,在将要执行最后绑定的类的头部,我声明了一个类型,该类型声明了一个函数指针,该指针具有message_handler必须具有的结构。在oder类中定义包装器方法将很容易:

代码语言:javascript
运行
复制
typedef void (*msg_handler_ptr)(client*,connection_hdl,message_ptr);

我花了很长时间才得到正确的声明。完成后,我已经在相应的类中声明了将执行绑定的函数:

代码语言:javascript
运行
复制
 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));
} 

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

代码语言:javascript
运行
复制
#include "mysocket_class.h"
void mycontroller::set_msg_handler(msg_handler_ptr myfunction)
{
    c.set_msg_handler(myfunction);
}

在我想要的任何地方,我声明我的真实msg_handler非常简单,它只会将它接收到的内容发送到标准输出:

代码语言:javascript
运行
复制
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);
}

这就是你将一个函数作为另一个函数的参数传递的方式。我的应用程序运行起来了。

感谢大家的提示!

票数 0
EN

Stack Overflow用户

发布于 2013-06-21 20:01:35

boost正在使用模板,也许你应该尝试一下,比如

代码语言:javascript
运行
复制
template <typename T>
void set_msg_handler(T myfunction){
    m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
}

但是如果你想强迫用户给出某种函数,你可以检查模板的专门化。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17234541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档