C++之Function-Like Classes,仿函数

    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。

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值