`
lunan
  • 浏览: 77956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Boost::bind

阅读更多
/*
Boost::bind

1) bind1st,bind2st函数绑定器,把二元函数对象变为一元函数对象。
2) mem_fun,把成员函数变为函数对象。
3) fun_ptr,把一般的全局函数变为函数对象。
4) boost::bind(),统一的接口实现以上所有的功能。

注意
1) 现在的类库最多可以支持9个参数。
2)在绑定一个成员函数时,bind 表达式的第一个参数必须是成员函数所在类的实例!理解这个规则的最容易的方法是,这个显式的参数将取替隐式的 this ,被传递给所有的非静态成员函数。细心的读者将会留意到,实际上这意味着对于成员函数的绑定器来说,只能支持八个参数,因为第一个要用于传递实际的对象。
3)当我们传递某种类型的实例给一个 bind 表达式时,它将被复制,除非我们显式地告诉 bind 不要复制它。要避免复制,我们必须告诉bind 我们想传递引用而不是它所假定的传值。我们要用 boost::ref 和 boost::cref (分别用于引用和 const 引用)来做到这一点,它们也是Boost.Bind 库的一部分。还有一种避免复制的方法;就是通过指针来传递参数而不是通过值来传递。
4) 通过 Boost.Bind, 你可以象使用非虚拟函数一样使用虚拟函数,即把它绑定到最先声明该成员函数为虚拟的基类的那个虚拟函数上。这个绑定器就可以用于所有的派生类。如果你绑定到其它派生类,你就限制了可以使用这个绑定器的类。
5)bind还可以绑定成员变量。
*/

#include "stdafx.h"
#include <iostream> 
#include <functional>
#include <string>
#include <vector>
#include <algorithm>
#include "boost/bind.hpp"

using namespace std; 
 
struct point  
{  
int x,y;  
point(int a=0,int b=0):x(a),y(b){}  
void print(){  
cout << "(" << x << "," << y << ")\n";  
}  
void setX(int a){  
cout << "setX:" << a << endl;  
}  
void setXY(int x,int y){  
cout << "setX:" << x << ",setY:" << y << endl;  
}  
void setXYZ(int x,int y,int z){  
cout << "setX:" << x << ",setY:" << y << "setZ:" << z << endl;  
}  
}; 


int main(void){ 

std::vector<int> ints;
ints.push_back(7);
ints.push_back(4);
ints.push_back(12);
ints.push_back(10);
int count=std::count_if(ints.begin(), ints.end(),
                    boost::bind(std::logical_and<bool>(),
            boost::bind(std::greater<int>(),_1,5),
boost::bind(std::less_equal<int>(),_1,10))
                   );
std::cout << count << '\n';

std::vector<int>::iterator int_it=std::find_if(ints.begin(),ints.end(), 
                   boost::bind(std::logical_and<bool>(),
               boost::bind(std::greater<int>(),_1,5),
   boost::bind(std::less_equal<int>(),_1,10))
);
if (int_it!=ints.end())
{  std::cout << *int_it << '\n';}


point p1,p2;  
bind(&point::setX,p1,_1)(10);  
bind(&point::setXY,p1,_1,_2)(10,20);  
bind(&point::setXYZ,p2,_1,_2,_3)(10,20,30);  
vector<point> v(2);  
//for_each的时候只需要_1就可以了  
for_each(v.begin(),v.end(),bind(&point::print,_1));  
for_each(v.begin(),v.end(),bind(&point::setX,_1,10));  
for_each(v.begin(),v.end(),bind(&point::setXY,_1,10,20));  
for_each(v.begin(),v.end(),bind(&point::setXYZ,_1,10,20,30));

return 0;  
}
分享到:
评论
1 楼 lunan 2011-11-28  
boost::bind是标准程序库std::bind1st与std::bind2nd的一般化;
而boost::lambda::bind是一个表达式,用于生成lambda的functor。

相关推荐

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

    boost::bind(handle_read, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); ``` 5. **关闭串口**: 完成通信后,别忘了关闭串口: ```cpp serial.close(); ``` 在...

    c++ boost bind

    其中,`boost::bind`是Boost库中的一个关键组件,用于实现函数对象的绑定,它类似于C++11中的std::bind,但在C++98/03标准下非常有用。 `boost::bind`的主要功能是将函数或成员函数与部分参数预先绑定在一起,形成...

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

    在IT领域,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,其中`bind`和`function`是两个非常实用的工具。本文将深入探讨这两个概念以及如何在消息处理框架中使用它们。 首先,让我们了解`...

    一个基于Boost::Process & ZeroMQ方案的C++多进程并发muiltprocessing-master.zip

    responder.bind("tcp://*:5555"); // 创建客户端 zmq::socket_t requester(context, ZMQ_REQ); requester.connect("tcp://localhost:5555"); // 交互过程 std::string request = "Hello"; requester.send...

    boost API 中文库

    5. **函数对象和绑定器**:boost::function和boost::bind允许将函数、成员函数和函数对象组合在一起,创建新的可调用对象。 6. **正则表达式**:boost::regex库提供了强大的正则表达式匹配和搜索功能,比C++标准库...

    boost最新官方帮助文档1.56.0

    2. **算法与函数**:Boost包含各种算法,如迭代器算法(`boost::algorithm`)、元编程函数库(`boost::mpl`)以及函数对象和适配器(如`boost::bind`和`boost::lambda`)。这些工具极大地扩展了C++的标准库功能。 3...

    Beyond The C++ Standard Library - An Introduction To Boost (2005)

    5. **函数对象和绑定**:介绍`boost::function`和`boost::bind`,这些工具可以简化函数对象的使用,实现函数的封装和部分应用。 6. **并发与多线程**:涵盖`boost::thread`库,包括线程创建、同步原语(如互斥量、...

    boost完美组合(你不用再找其他的boost书籍了)

    `boost::bind`和`boost::function`提供了函数对象和函数指针的通用接口;`boost::spirit`则是一个强大的解析器库,用于构建复杂语法解析器。 3. **boost-thread.pdf**: Boost.Thread库是C++线程编程的重要资源,...

    Boost程序库完全开发指南

    - **函数对象和绑定器**:如`boost::function`和`boost::bind`,使得函数和方法可以像对象一样处理。 - **并发编程**:如`boost::thread`和`boost::mutex`,支持多线程编程。 - **算法和数据结构**:如`boost::...

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

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

    Boost视频教程

    - **知识点**:Boost.Lambda和Boost.Bind为C++提供了强大的函数式编程能力。 - **应用技巧**: - 利用`boost::lambda`快速定义简单的匿名函数,简化代码。 - 通过`boost::bind`绑定函数参数,创建新的可调用对象。...

    C++标准库Boost程序库导论

    Boost中提供了多个库来支持函数对象的使用,如`boost::bind`和`boost::lambda`。`boost::bind`用于创建函数对象,可以绑定参数到函数上,从而改变函数的行为;而`boost::lambda`则允许直接在代码中创建匿名函数,极...

    boost.tar.gz

    1. **泛型编程**:Boost库鼓励使用模板和泛型编程,提供了一系列如`boost::mpl`(元编程库)、`boost::function`和`boost::bind`等工具,使代码更加灵活和可重用。 2. **智能指针**:Boost库包含多种智能指针,如`...

    C++ Boost 库中文文档

    4. **函数对象**:`boost::function`和`boost::bind`提供了通用函数对象和绑定功能,增强了函数调用的灵活性。 5. **正则表达式**:`boost::regex`库提供了强大的正则表达式处理功能,用于文本搜索和替换。 6. **...

    steady_timer使用

    t-&gt;async_wait(boost::bind(print, boost::asio::placeholders::error, t, count)); } } int main() { int count = 0; boost::asio::io_context io_ctx; boost::asio::steady_timer t(io_ctx, boost::asio::...

    boost-STL.rar_Boost_STL_boost学习资料

    5. `boost::bind`和`boost::function`:提供更灵活的函数对象绑定和函数对象封装。 **学习资源** "boost-STL学习资料合集.chm"是一个关于Boost.STL学习的综合资源,可能包含了详细的教程、示例代码、实践指南等...

    highscore_boost,boost学习

    - **函数适配器**:例如`boost::bind`,它可以将普通函数包装成函数对象,使得函数参数可以通过绑定预先确定,增强了函数的灵活性。 - **函数对象容器**:比如`boost::function`,它可以存储不同类型、不同参数数量...

    Boost-C++库_1.42(中文版)

    4. Boost.Bind:提供函数绑定功能,boost::bind。 5. Boost.Conversion:提供类型转换功能。 6. Boost.DateTime:提供日期和时间的处理功能。 7. Boost.Exception:提供异常处理相关功能。 8. Boost.Filesystem:...

    boost asio tcp服务器的实现

    首先,我们需要创建一个`boost::asio::ip::tcp::endpoint`对象,指定服务器的IP地址和端口号,然后调用acceptor的`open`方法打开对应的协议族,`bind`方法绑定到指定端口。 2. **监听客户端连接** 调用`acceptor`...

Global site tag (gtag.js) - Google Analytics