C++中构造的类像函数,首先我们需要清楚函数有哪些特点。函数由返回类型,函数名称,参数(小括号,作用在函数名上)和函数主题组成。小括号内含参数这部分也称作function core operator,函数调用操作符。如果有个东西能接受小括号,那它就是函数function,或者仿函数function-like。
下面的代码实现了仿函数的使用:
template <class T1, class T2>
struct pair
{
T1 first;
T2 second; //first和second类型不需要一样
pair() : first(T1()), second(T2()) {}
pair(const T1& a, const T2& b)
: first(T1()), second(T2())
......
};
template<class T>
struct identity : public unary_function<T,T>
{
const T&
operator() (const T& x) const { return x; }
};
template<class Pair>
struct select1st : public unary_function<Pair, typename Pair::first_type>
{
const typename Pair::first_type&
operator() (const Pair& x) const { return x.first; }
};
template<class Pair>
struct select2nd : public unary_function<Pair, typename Pair::second_type>
{
const typename Pair::second_type&
operator() (const Pair& x) const { return x.second; }
};
上面的三个类中都包括操作符重载operator(),叫做function-like classes。那么由类创建的对象就叫做函数对象functor。这三个类有各自继承类unary_function。C++标准库中的还有其他的仿函数:
template<class T>
struct plus : public binary_function<T, T, T>
{
T operator() (const T& x, const T& y) const { return x + y; }
};
template<class T>
struct minus : public binary_function<T, T, T>
{
T operator() (const T& x, const T& y) const { return x - y; }
};
template<class T>
struct equal_to : public binary_function<T, T, bool>
{
bool operator() (const T& x, const T& y) const { return x == y; }
};
template<class T>
struct less : public binary_function<T, T, bool>
{
bool operator() (const T& x, const T& y) const { return x < y; }
};
上面三个类各自继承类binary_function。
template <class Arg, class Result>
struct unary_function
{
typedef Arg argument_type;
typedef Result result_type;
};
template <class Arg1, class Arg2, class Result>
struct binary_function
{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
这两个类的实际大小是0,但在程序中用sizeof来测大小,返回值确实1。