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));