STL FunctionObject实现 - sgi扩展

    技术2022-05-11  128

    template <class _Tp>struct _Identity : public unary_function<_Tp,_Tp> {  const _Tp& operator()(const _Tp& __x) const { return __x; }};

    template <class _Tp> struct identity : public _Identity<_Tp> {};

    //验证模板参数是不是一个函数对象类型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;  }};

    template <class _Pair> struct select1st : public _Select1st<_Pair> {};template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};

    //忽略模板参数为pair类型所包含的相应参数(第一个参数和第二个参数)template <class _Arg1, class _Arg2>struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> {  _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }};

    template <class _Arg1, class _Arg2>struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> {  _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }};

    template <class _Arg1, class _Arg2> struct project1st : public _Project1st<_Arg1, _Arg2> {};

    template <class _Arg1, class _Arg2>struct project2nd : public _Project2nd<_Arg1, _Arg2> {};

    //忽略调用运算符时相应的参数

    template <class _Result>struct _Constant_void_fun {  typedef _Result result_type;  result_type _M_val;

      _Constant_void_fun(const result_type& __v) : _M_val(__v) {}  const result_type& operator() const { return _M_val; }}; 

    template <class _Result, class _Argument>struct _Constant_unary_fun {  typedef _Argument argument_type;  typedef  _Result  result_type;  result_type _M_val;

      _Constant_unary_fun(const result_type& __v) : _M_val(__v) {}  const result_type& operator()(const _Argument&) const { return _M_val; }};

    template <class _Result, class _Arg1, class _Arg2>struct _Constant_binary_fun {  typedef  _Arg1   first_argument_type;  typedef  _Arg2   second_argument_type;  typedef  _Result result_type;  _Result _M_val;

      _Constant_binary_fun(const _Result& __v) : _M_val(__v) {}  const result_type& operator()(const _Arg1&, const _Arg2&) const {    return _M_val;  }};

    //返回一个普通变量的const副本,无论参数为何,只返回同一个值的函数对象template <class _Result>struct constant_void_fun : public _Constant_void_fun<_Result> {  constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {}}; 

    template <class _Result,          class _Argument __STL_DEPENDENT_DEFAULT_TMPL(_Result)>struct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument>{  constant_unary_fun(const _Result& __v)    : _Constant_unary_fun<_Result, _Argument>(__v) {}};

    template <class _Result,          class _Arg1 __STL_DEPENDENT_DEFAULT_TMPL(_Result),          class _Arg2 __STL_DEPENDENT_DEFAULT_TMPL(_Arg1)>struct constant_binary_fun  : public _Constant_binary_fun<_Result, _Arg1, _Arg2>{  constant_binary_fun(const _Result& __v)    : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {}};

    //__STL_DEPENDENT_DEFAULT_TMPL 是一个宏,意思是如果编译器不支持默认模板参数,则使用上一级模板参数template <class _Result>inline constant_void_fun<_Result> constant0(const _Result& __val){  return constant_void_fun<_Result>(__val);}

    template <class _Result>inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val){  return constant_unary_fun<_Result,_Result>(__val);}

    template <class _Result>inline constant_binary_fun<_Result,_Result,_Result> constant2(const _Result& __val){  return constant_binary_fun<_Result,_Result,_Result>(__val);}//函数返回一个只返回常量和输入参数无关的函数对象

    class subtractive_rng : public unary_function<unsigned int, unsigned int> {private:  unsigned int _M_table[55];  size_t _M_index1;  size_t _M_index2;public:  unsigned int operator()(unsigned int __limit) {    _M_index1 = (_M_index1 + 1) % 55;    _M_index2 = (_M_index2 + 1) % 55;    _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2];    return _M_table[_M_index1] % __limit;  }  void _M_initialize(unsigned int __seed)  {    unsigned int __k = 1;    _M_table[54] = __seed;    size_t __i;    for (__i = 0; __i < 54; __i++) {        size_t __ii = (21 * (__i + 1) % 55) - 1;        _M_table[__ii] = __k;        __k = __seed - __k;        __seed = _M_table[__ii];    }    for (int __loop = 0; __loop < 4; __loop++) {        for (__i = 0; __i < 55; __i++)            _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55];    }    _M_index1 = 0;    _M_index2 = 31;  }  subtractive_rng(unsigned int __seed) { _M_initialize(__seed); }  subtractive_rng() { _M_initialize(161803398u); }};

    //随机数


    最新回复(0)