超小型的bind库 bi-bind

GPLv3
C/C++
跨平台
2013-05-09
蜗牛狂奔吧

boost中有一个bind库, 可以说是一个最为实用的tools了, 但是它与boost结合的有些紧密,而且其中的一些功能并不是很常用,就算将它bcp出独立的库也是一个不小的负担。如果在你的项目中不打算有boost库的痕迹但是又想使用bind的强大功能,那就来看看它吧。

一个一个超小型的bind库, 它实现了大部分boost::bind的功能, 只是将名字空间由boost 变换为 bi 。如果使用了一般的使用中通常可以将

boost::bind(my_fun(), _1,_2)(234, "hello world"); 形式替换为 bi::bind(my_fun(), _1, _2)(234, "hello world"),

既可完成编译,如果使用了名字空间,那就只需要将 using namespace boost 替换为 using namespafce bi 即可完成转化。

它对一般函数、成员函数, 虚拟函数, 函数对象都提供了全面支持。

但是....

bi::bind没有打算支持boost库, 如果在你的项目中使用了其它的boost‘tools,那你就不需要它了(或许也可以拿来研究研究),既然使用了boost,就不在乎在使用boost::bind了,所以boost::bind中涉及到与其它boost库的有交集的功能bi::bind库都没有支持。

它自然支持 boost::shared_ptr, 同时对c++10 保标准的shared_ptr也有很好的支持。

bi::bind借鉴了boost::bind的一些思想,有些代码甚至是直接从bind.hpp中复制过来的,但它在牺牲一些扩展性和多平台支持性的后果下, 同样的代码比boost::bind中有40%的效率提升 。

bi-bind 同时提供了 callback功能, 它就像是一个简化版本的 boost::function, 对一次调用行为做了抽象。

例如:

int fun1(int p2)
{
   std::cout << "call fun1" << std::endl;
   return p2 *  p2;
}

struct fun2
{
   fun2(int p1)
   {
      p_ = p1;
   }

   int operator()(int p2) const
   {
      return p2 * p_;
   }

   int p_;
};

//绑定一般函数 构造 callback
bi::callback cb = bi::bind(&fun1, _1);
int r = cb(2);   //r=4,使用了实际参数2

//绑定仿函数对象赋值给callback
cb = bi::bind(fun2(2), 9);
r = cb(100);     //r=18,使用了绑定参数9
bind 通常都接收它们的参数的拷贝, 并会在bind_t对像中保存一份相同的对象,而有些对像不具备拷贝语义或是拷贝的代价很大。 为了解决这个问题对,bind对像的可以使用ref 方式将这个对像封装起来使用。它定义了类模板 reference_wrapper和 两个返回实例的函数 ref 和 cref。

reference_wrapper 的目的是容纳一个引向类型为 T 的对象的引用。它主要用于把引用传给bind_t对像, bint_t对像中有对此的重载,即可以解开引用,调用实际的对像。

struct fun2
{
   fun2(int p1)
   {
      p_ = p1;
   }

   int operator()(int p2) const
   {
      return p2 * p_;
   }

   int p_;
};

//假设fun2的拷贝复制的负担很大
fun2 f(23);

//使用bi::ref解除对f对像的值语义调用
bi::bind(bi::ref(f), 9)(2);

加载中

评论(0)

暂无评论

暂无资讯

暂无问答

boost::bind源码剖析(实例分析)

bind的本质:就是创建一个Functor对象(重载了operator()的类对象) 通过将多余的函数参数和函数指针存储为Funtor对象的成员变量,在调用operator()函数是,利用存储的函数指针和函数参数,返...

2010/10/12 20:55
1K
0
新的bind库 (bi-bind), 对boost::bind的精简

boost中有一个bind库, 可以说是一个最为实用的tools了, 但是它与boost结合的有些紧密,而且其中的一些功能并不是很常用,就算将它bcp出独立的库也是一个不小的负担。如果在你的项目中不打算...

2013/05/08 23:41
1K
0
oci_fetch_array()没有返回值

<?php session_start(); putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK"); $conn = oci_connect('cis', 'aking710202', 'Einsunjw'); $nj = trim($_GET['njid']); $fdybh = trim($_SE...

2013/11/18 17:51
284
0
前端做模糊搜索

我们先看一下效果图: 这是搜索关键字cfg时,会自动匹配到config方法 同样,我们再看另一个例子 通过关键字bi会匹配到好几个结果 这个和一些编辑器的搜索功能很像,比如sublime text,不需要...

2018/07/03 15:00
8
0
dig

linux下的DNS详细配置(bind)(转) 2010-03-22 19:01 今天来教大家在 redhat AS5下面配置DNS服务器。 一、准备工作: 1 系统:Redhat AS 5 2 软件:bind-9.6.0-P1.tar.gz (在http://www.is...

2010/07/26 10:51
268
0
BI平台应用日趋人性化

在BI的不断发展过程中,BI的应用平台也在不断的改进,BI在企业的内部不仅仅是一个计算机的系统,同时还是一个服务系统,可以将各个部门之间的人员进行联系,统筹的使用企业中的信息,实现BI平...

2015/07/28 17:44
13
0
您的BI用到位了吗?

国外名人谈BI商业智能 BI是什么,是智能化的数据分析?是报表?是数据模型?我们都希望使用BI可以达到预期的效果,实现企业数据更加智能化的服务,并且帮助将数据分析的结果展示出来。企业要...

2016/01/03 14:29
12
0
BI厂商的定位决定成败

对于BI厂商来说,特别是一些新兴的BI厂商,在近几年的发展都是比较有挑战的,很多BI平台功能很齐全的企业,但是用户使用起来的体验度并没有想象中那么好,这是因为虽然应用的广泛,但是因为平...

2015/09/22 13:37
7
0
BI也存在最后一公里

BI的实施在国内已经走过了10年的历程,对于BI这个概念很多人就是知道直白的意思商业智能,在企业当中BI的作用体现在哪里,是通过什么方式体现出来的,这对于很多这个行业的人来说,都是一个新...

2015/06/25 13:30
4
0
移动商业智能助力企业决策能力

商业智能(BI)成为近年CIO 关注的热点技术之一,而移动BI,作为BI的多种展现形式之一,又能够为企业带来哪些价值?   BI重视 移动BI存在潜在需求   提起商业智能(BI),相信许多的CIO或者I...

2014/11/25 17:44
6
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部