c++ primer可调用对象
如果一个对象可以使用调用运算符(())来调用一个函数,()里面可以放参数,这个对象就是可调用对象。 可调用对象也有类型,例如每个lambda都有他自己唯一(未命名的类型) 我们可以像算法传递任何类别的可调用对象,可调用对象分为以下几种: 1. 函数和函数指针 2. 重载了函数调用运算符的类 3. lambda表达式 4. bind的对象 5. 利用function生成 6. mem_fn生成
不同类型的对象可能有相同的调用形式
函数和函数指针
template
<class T
>
struct printarray
{
void operator()(const T
& t
)const {
cout
<< t
<< endl
;
}
};
void test04()
{
int ia
[] = { 23, 96, 4, 5 };
qsort(ia
, sizeof(ia
) / sizeof(int), sizeof(int), fun
);
for_each(ia
, ia
+ sizeof(ia
) / sizeof(int), printarray
<int>());
}
函数指针的缺点:无法持有自己的状态,也无法达到组件技术中心的可适配性(无法二次修饰,改变状态)
重载Operator()的类对象
class TestA
{
public
:
TestA() {};
~TestA() {};
int operator()(int a
, int b
)
{
return a
+ b
;
};
private
:
};
void test01()
{
TestA a
;
int i
= a(5, 7);
}
STL算法接收的仿函数的就是该方法。要成为可配接的仿函数还需要做更多的事情。这部分在仿函数到底是什么一节中叙述
function生成
function
<bool(const string
&)> fcn
= &string
::empty
;
vector
<int> vecT
= { 1,2, 3 };
find_if(vecT
.begin(), vecT
.end(), fcn
);
mem_fn生成
function必须要提供成员的调用形式,可以使用mem_fn让编译器自动生成
vector
<int> vecT
= { 1,2, 3 };
find_if(vecT
.begin(), vecT
.end(), mem_fn(&string
::empty
));
使用bind生成
auto f
= find_if(vec
.begin(), vec
.end(), bind(&string
::empty
, _1
));