函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现。如果对某个class进行operator()重载,它成为一个仿函数。
#include <iostream>
using namespace std;
template<class T>
struct Plus
{
T operator()(const T& x, const T& y)const
{
return x + y;
}
};
template<class T>
struct Minus
{
T operator()(const T& x, const T& y)const
{
return x - y;
}
};
int main()
{
Plus<int>plusobj;
Minus<int>minusobj;
cout << plusobj(3, 4) << endl;
cout << minusobj(3, 4) << endl;
//以下直接产生仿函数的临时对象,并调用
cout << Plus<int>()(43, 50) << endl;
cout << Minus<int>()(43, 50) << endl;
system("pause");
return 0;
}
  产生临时对象的方法:在类型名称后直接加一对小括号,并可指定初值。stl常将此技巧应用于仿函数与算法的搭配上。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
template <class InputIterator,class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for (; first != last; ++first)
{
f(*first);
}
return f;
}
*/
template <typename T>
class print
{
public:
void operator()(const T& elem)
{
cout << elem << ' ' << endl;
}
};
int main()
{
int ia[6] = { 0,1,2,3,4,5 };
vector<int>iv(ia, ia + 6);
for_each(iv.begin(), iv.end(), print<int>());
system("pause");
return 0;
}