Boost::Bind 基础

先了解一下:函数对象

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。[1]

一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个

类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的

operator()来实现的。比如,对于调用

int s = sum(1, 1);

你可能把它看作一个函数调用:

int sum(int i, int j) { return i+j; }

但很可能它是一个函数对象:

class Sum {

public:

int operator()(int i, int j) { return i+j; }

};

Sum sum;

而大多数情况是

template <class T>

class Sum {

public:

T operator()(T i, T j) { return i+j; }

};

Sum <int> sum;

“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以

使用函数对象或者函数来作为自定的回调行为;

当我们使用函数时习惯于C函数的格式,即如下形式

resulttype funname( arglist );

返回值类型 函数名( 参数列表 );

在Boost.Function中,我们可以方便的定义定义函数对象。不过在定义用来表示类成员函数的函数对象时

第一个参数是类指针。而且在调用时,要传入一个类实例的指针。这样用起来并不是很方便,因为调用者

要知道类实例。这实际上没有实现解耦。而解耦是我们使用回调或委托设计的一个目标。

为了解决这个问题,我们要使用Boost.Bind库

Boost.Bind是一个函数对象工厂。他用来产生我们需要的函数对象。好了,有了它,你可以在你设计中大

量使用Boost.Function。不用再去定义类成员函数形式的函数对象啦,只用定义普通函数对象。

一个简单的例子

class CExample

{

public:

bool printstr( const std::string &str )

{

std::cout << "CExample::printstr" << str << std::endl;

return true;

}

};

//定义一个函数对象

boost::function< bool ( const std::string& ) > printstr;

//用Boost.Bind创建一个函数对象,赋给printstr

CExample example;

printstr = boost::bind( &CExample::printstr, &example, _1 );

好了,我们创建了一个函数对象,而且调用时不再需要类实例拉。用Boost.Function和Boost.Bind大大

的简化了Command模式的实现。

在上面的例子中要个古怪的对象"_1"。这个叫做站位符,他代表这个位置有个参数,但现在还不知道参

数是什么。_1代表参数列表中的第一个位置上的参数。Boost.Bind一共定义了9个站位符对象。如下

_1,_2,_3,_4,_5,_6,_7,_8,_9。分别代表参数列表中位子。

Boost.Bind产生的函数对象可以直接使用,利用上面的例子。

bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );

时间: 2024-10-06 00:39:03

Boost::Bind 基础的相关文章

Boost::bind学习

1什么是函数对象 2Boostbind 绑定自由函数 绑定全部参数 不绑定全部参数 绑定类的函数 boostbind绑定的值是拷贝形式的值传递 1.什么是函数对象 在了解函数对象之前,应该先知道什么是函数指针,函数指针不再介绍了.函数对象用起来比函数指针更加灵活,且可以实现内联函数. 函数对象是具有函数功能的对象.怎么才能使对象具有函数的功能呢?答案是重载操作符().加入要实现两个整数相加: class Add { public: int operator()( int a, int b) {

DNS&BIND——基础知识

DNS & BIND(1) what-DNS& BIND DNS: Domain Name Service 已于C/S架构的协议 53/udp:  域名解析 53/tcp  :  区域传输 BIND: Bekerley Internet Name Domain BIND对DNS协议的开源实现,包含对域名的查询和响应所需的所有软件 BIND是互联网上最广泛使用的一种DNS服务器 传输方式 1)区域传输 的时候使用TCP协议 : 主DNS服务器: 从自己本机的数据文件中读取该区的DNS数据信息

DNS服务基础及bind基础配置和应用

DNS服务基础及bind基础配置和应用  DNS服务基础011.DNS:Domain   Name  Service,  ( 应用层协议)2.tld:Top Level Domain 顶级域(1)顶级域中的组织域.com  (company).net    网络组织.org非盈利型组织   org:other  organizations.gov  government.edu    教育机构.mil   military军事的,军队,军人...(2)顶级域中的国家域.tw   .hk  .cn

boost::bind 详解

使用 boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式.其可以支持函数对象.函数.函数指针.成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置. 1. 通过functions和function pointers使用bind 给定如下函数: 1 int f(int a, int b) 2 { 3 return a + b; 4 } 5 6 int g(int a, int b, int c) 7 { 8 return a + b

Boost.Asio基础(五) 异步编程初探

异步编程 本节深入讨论异步编程将遇到的若干问题.建议多次阅读,以便吃透这一节的内容,这一节是对整个boost.asio来说是非常重要的. 为什么需要异步 如前所述,通常同步编程要比异步编程更简单.同步编程下,我们很容易线性地对问题进行考量,函数A调用完,继续执行B,B执行完,继续执行C,以此类推,相对比较直观.而对于异步编程,假设有5个事件,我们很难知道它们具体的执行顺序,你甚至不知道,它到底会不会被执行. 虽然编写异步的程序,很难,但是依然需要使用这种方法.因为服务器程序需要同时并行的处理大量

boost::bind boost::function

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #include <boost/bind.hpp> #include <boost/function.hpp> #include <iostream&g

boost::bind实践

第一部分源码为基础实践: 1 /*Beyond the C++ Standard Library ( An Introduction to Boost )[CN].chm*/ 2 /*bind的用法*/ 3 4 #include <iostream> 5 #include <algorithm> 6 #include <functional> 7 #include <vector> 8 9 #include <boost/bind/bind.hpp&g

1,Boost -&gt; Bind

#include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <iostream> using namespace std; void dprint(int x,int y) { cout << x << " " <<y <<endl; } class Bind_test { public: void setData(int x,i

boost::bind测试代码

// Copyright (c) 2015 // Author: Chrono Law #include <std.hpp> //using namespace std; #include <boost/bind.hpp> using namespace boost; ////////////////////////////////////////// int f(int a, int b)<span style="white-space:pre">