这个系列主要希望弄明白boost::bind的实现原理,回到研究之四的简单使用的例子。稍微加点代码,也绑定Foo函数。
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>
using namespace std;
bool Foo(int x) {
return x >= 2;
}
typedef bool (*FooPointer)(int x);
int main(int argc, char** argv) {
FooPointer p = Foo;
vector<int> v;
v.push_back(1);
v.push_back(2);
// bind Foo function
vector<int>::iterator itor = std::find_if(v.begin(), v.end(),
boost::bind(Foo, _1));
cout << *itor << endl;
// bind FooPointer
itor = std::find_if(v.begin(), v.end(),
boost::bind(p, _1));
cout << *itor << endl;
return 0;
}
两次查找分别使用了Foo函数和FooPointer函数指针。
boost提供了一些bind重载模板函数,bind实际上是通过宏出现的,在bind.hpp中如下定义:
#ifndef BOOST_BIND
#define BOOST_BIND bind
#endif
第一个bind(foo, _1)用到了下面的重载形式:
template<class R, class F, class A1>
_bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
BOOST_BIND(F f, A1 a1)
{
typedef typename _bi::list_av_1<A1>::type list_type;
return _bi::bind_t<R, F, list_type> (f, list_type(a1));
}
所以这里F f就是指的Foo函数, 这个地方有点意思,因为函数Foo居然可以像类型一样作为模板参数传递。我以前从未这样用过。
迅速做个实验:
template <typename F>
void Test(F f){
cout << f(2);
}
int main(int argc, char** argv) {
Test(Foo);
return 0;
}
编译运行成功,输出结果为1.
A1 a1指的是外面调用代码传递进来的_1.
分享到:
相关推荐
主要介绍了C++ 11 std::function和std::bind使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
bind bind bind bind
c++11引入了std::bind及std::function,实现了函数的存储和绑定,即先将可调用的对象保存起来,在需要的时候再调用。定义了SignalObject信号类和SlotObject槽类,其中信号类中的 std::function(int)> _call就是要...
但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其实就是 Function.prototype.bind() ,只是你有可能仍然没有意识到这点。 第一次遇到这个问题的时候,你可能倾向于将...
算是一个消息处理框架吧,用于说函数对象function与bind的基本用法; 比较适合入门boost的function与bind的基本用法
C++里面的function是一个非常奇妙的东西,但是你想过他是如何实现的吗?作者在深刻理解了其中奥妙之后写就的精简版本。而且可以避免STL里面的function无法和Socket编程一起使用的问题——bind会无法正确解析。
主要介绍了理解javascript中的Function.prototype.bind的方法,具有一定参考价值,有兴趣的可以了解一下。
前言 bind()接受无数个参数,第一个参数是它生成的新函数的this指向,比如我传个window,不管它在何处调用,这个新... getX: function() { return this.x; } }; module.getX(); // 返回 81 var retrieveX = module.get
实现了标准库中的function和bind以及智能指针,linux/windows通用。由于公司GCC版本较老,嵌入式的gcc也无法由我来控制,windows上使用的一些类似智能指针,在linux上无法使用,甚是不爽,于是自己手动写了一份,...
大家都知道C++11中增加了许多的新特性,下面在这篇文中我们就来聊一下lambda表达式,闭包,std::function以及std::bind。文中介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
在 <functional> 头文件中, std::function 是个可调用Callable对象的容器,可以容纳 函数、函数指针、lambda表达式、成员函
BIND9中文手册 BIND9中文手册 BIND9中文手册 BIND9中文手册 BIND9中文手册
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...
赠送jar包:jakarta.xml.bind-api-2.3.3.jar; 赠送原API文档:jakarta.xml.bind-api-2.3.3-javadoc.jar; 赠送源代码:jakarta.xml.bind-api-2.3.3-sources.jar; 赠送Maven依赖信息文件:jakarta.xml.bind-api-...
BIND9配置手册 BIND9.9管理员手册 DNS配置手册
绑定,致电,申请实验室目标使用JavaScript的绑定,调用和应用方法来更改函数的范围并正确传递参数指示在本实验中,我们的测试定义了一些函数,然后将这些函数传递给我们要求您编写的函数。 您的函数不仅应调用作为...
BIND9 IPV6操作指南 BIND9 IPV6操作指南
ES5的bind手写实现
赠送jar包:jakarta.xml.bind-api-2.3.3.jar; 赠送原API文档:jakarta.xml.bind-api-2.3.3-javadoc.jar; 赠送源代码:jakarta.xml.bind-api-2.3.3-sources.jar; 赠送Maven依赖信息文件:jakarta.xml.bind-api-...