轻量级前端框架助力开发者提升项目效率与性能
710
2022-11-02
bi-bind- 超小型的bind库
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_;};//绑定一般函数 构造 callbackbi::callback cb = bi::bind(&fun1, _1);int r = cb(2); //r=4,使用了实际参数2//绑定仿函数对象赋值给callbackcb = 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);
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~