`
OrangeHolic
  • 浏览: 261434 次
  • 来自: 北京
社区版块
存档分类
最新评论

boost::function对象 convert 函数指针

    博客分类:
  • C++
阅读更多
boost::function对象与函数指针比较相似,优点在于它拥有更大的弹性,目标既可以是普通函数、函数对象或者类的成员函数,而且还可绑定参数,给回调提供了极大的方便。但是C语言的函数是不支持boost::function对象的,当需要函数指针的C函数填写上boost::function对象时候,就出现下面的error

cannot convert 'boost::function<void*(void*)>' to 'void* (*)(void*)'

其实我们可以在中间加上一个proxy的函数来解决

如下,pthread_create需要的为函数指针,而我们需要绑定一些参数,我们就可以创建一个proxy代理函数,代理函数复合pthread_create所需函数的要求,但在代理函数里边执行我们的boost::function对象表示的函数。

#include <iostream>
#include <string>
#include <thread>
#include <boost/format.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>

#define  LOG(content) cout<<content<<endl;

using namespace std;

void* realThreadFunction( int first, int second, void *agrv) {

     //Do things with first and second

     string content = (boost:: format( "%1% + %2% = %3%") % first % second
              % (first + second)).str();

     LOG(content);
     return NULL;

}

void* proxyThreadFunction( void * agrv) {

     boost::function< void*(void *)>* threadFunction =
               reinterpret_cast<boost::function <void*(void *)> *>(agrv);

     (*threadFunction)(NULL);

     return NULL;

}

int main() {

     int a = 10, b = 20;

     pthread_t threadId;

     boost::function< void*(void *)> threadFunction = boost::bind(
              realThreadFunction, a, b, _1);

     if (0 == pthread_create(&threadId, NULL, proxyThreadFunction, &threadFunction)) {

          boost::this_thread::sleep(boost::posix_time:: seconds(5));

          pthread_join(threadId, NULL);

     } else {

          LOG( "create thread fail.")
     }

     return 0;
}
 

分享到:
评论

相关推荐

    boost::asio::serialport实现串口通信

    Boost库是C++的一个强大工具集,它提供了`boost::asio`模块,用于处理网络和底层I/O操作,包括串口通信。本篇文章将详细介绍如何使用`boost::asio::serialport`来实现串口通信。 首先,我们需要理解`boost::asio`的...

    Boost::Serialization存储C++对象

    Boost::Serialization是C++库中的一个模块,它提供了一种序列化和反序列化对象的能力。这个库使得能够将复杂的C++对象结构保存到文件、数据库或者网络流中,然后在需要时重新加载,这对于数据持久化、版本控制以及跨...

    boost—thread教程

    首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示...该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,在下面有例子。

    boost::any的C++实现加验证

    在`any.hpp`头文件中,`boost::any`的实现通常包括一个指向存储数据的指针和一个虚函数指针,它们一起构成了`boost::any`对象的内部结构。`boost::any`的构造、赋值、类型检查和值提取等操作都会通过这些指针调用...

    基于boost的bind与function的消息处理框架

    `function`是一个通用的函数对象容器,它可以存储任何类型的可调用对象,包括普通函数、成员函数指针、函数对象、Lambda表达式等。这为我们提供了类型安全和动态绑定的能力,使得我们可以根据需要灵活地存储和调用...

    boost::asio::serial下6个工程演示多种串口读取写入方式方法

    boost::asio::serial下6个工程演示多种串口读取写入方式方法,包含simple,with_timeout,async,callback,qt_integration,stream 等多个工程演示多种方式读取,写入串口,char,string ,buffer[]等多种数据格式。

    boost::lexical_cast用法

    boost::lexical_cast用法示例,包含数值转字串,字串转数值以及相应的异常处理代码

    人工智能和机器学习之分类算法:CatBoost:CatBoost的损失函数与优化目标.docx

    人工智能和机器学习之分类算法:CatBoost:CatBoost的损失函数与优化目标.docx

    xcode iOS 使用 boost::asio 的 demo

    在TCP通信中,`boost::asio::async_connect`用于异步建立连接,`boost::asio::async_read_some`和`boost::asio::async_write_some`则用于异步读写数据。UDP通信中,`boost::asio::async_send_to`和`boost::asio::...

    the boost c++ library.pdf

    - **比较 Boost.Function 函数对象**:如何比较不同的 `boost::function` 对象。 4. **参考** - **定义**:定义了 `boost::function` 相关的类和函数。 - **头文件**:`#include &lt;boost/function.hpp&gt;` - **...

    boost::asio写的文件上传下载程序

    boost::asio完成了通讯模块的编写,界面用MFC简单做了一下。 局域网的测试结果: 传输速度在6-7m/s 并发到500,服务器CPU和网络应用均出现使用99%的情况出现硬件瓶颈,新连接无法建立(测试服务器比较差,CPU:...

    boost::asio高效服务端

    5. **事件驱动编程**:`boost::asio`基于事件驱动模型,通过`io_service`对象调度和处理事件。当有新的连接、数据到达或其他I/O事件发生时,`io_service`会通知相应的回调函数,使得程序能及时响应这些事件。 6. **...

    基于Numpy和Boost::Python实现的矩量法

    【作品名称】:基于Numpy和Boost::Python实现的矩量法 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Numpy和...

    改进 boost::object_pool 内存池效率问题。

    相信不少人听过 boost 委员会提过 boost 里的对象池设计存在缺陷。我花了一些时间研究它的实现,发现其在效率上确实存在严重问题。这里给出一套解决方案。在效率上有了较大提高。可以完全替换你项目里的 object_pool...

    深入实践Boost:Boost程序库开发的94个秘笈(中文版)

    4. **函数对象和绑定器**:Boost.Function和Boost.Bind使得函数对象和成员函数能够更加灵活地组合和使用,提高了代码的可读性和可维护性。 5. **并发编程**:Boost.Thread库提供了线程、互斥量、条件变量等工具,...

    深入实践Boost:Boost程序库开发的94个秘笈

    8. **Boost波纹数值计算库**(Boost.Phoenix):是函数对象库,用于构建表达式模板,实现类似Lisp的函数式编程风格。 9. **Boost波纹图**(Boost.Graph):提供了抽象图的数据结构和算法,适用于网络和图论问题的...

    C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是...

    boost 基于SSL的通信 CLIENT

    接下来,客户端会创建一个`boost::asio::ip::tcp::socket`对象,并将其包装在一个`boost::asio::ssl::stream`对象中,这个对象是SSL/TLS通信的核心。通过`connect`方法,客户端可以建立到服务器的连接。在连接建立后...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    然而,`std::unique_ptr`不支持拷贝构造函数和赋值操作符,所以我们需要使用`boost::serialization::make_nvp`创建一个命名值对,并在`archive`对象上调用`save_object`或`save_pointer`方法。 接下来是`std::...

Global site tag (gtag.js) - Google Analytics