zoukankan      html  css  js  c++  java
  • 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd

    http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html

    以前使用bind1st以及bind2nd很少,后来发现这两个函数还挺好玩的,于是关心上了。
    在C++ Primer对于bind函数的描述如下:

    绑定器binder通过把二元函数对象的一个实参绑定到一个特殊的值上将其转换成一元函数对象

    C++标准库提供了两种预定义的binder 适配器bind1st 和bind2nd 正如你所预料的bind1st 把值绑定到二元函数对象的第一个实参上bind2nd 把值绑定在第二个实参上
    例如
    为了计数容器中所有小于或等于10 的元素的个数我们可以这样向count_if()传递
    count_if( vec.begin(), vec.end(), bind2nd( less_equal<int>(), 10 ));


    哦,这倒是挺有意思的。于是依葫芦画瓢:

    bool print(int i, int j) 
    {
        std::cout
    << i << "---" << j << std::endl; 
        
    return i>j;
    }

    int main(int argc, char *argv[])
    {
        (std::bind1st(print, 
    2))(1);
        
    return 0;

    }

    满怀希望它能够打印
    2---1

    只不过。。。编译出错:
    1    Error    error C2784: 'std::binder1st<_Fn2> std::bind1st(const _Fn2 &,const _Ty &)' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'    
    ---不能够推断出模板参数for 'overloaded function type' from 'overloaded function type' 。。。。
    (还真看不明白。。。)

    于是直接看bind1st代码:

    template<class _Fn2,
        
    class _Ty> inline
        binder1st
    <_Fn2> bind1st(const _Fn2& _Func, const _Ty& _Left)
            {    
            typename _Fn2::first_argument_type _Val(_Left);
            
    return (std::binder1st<_Fn2>(_Func, _Val));
            }

    嗯。。。在代码里
    typename _Fn2::first_argument_type _Val(_Left)
    说必须定义
    first_argument_type类型,可是我一个函数,哪里来的这个类型定义?嗯,STL一定提供了某种东东用来自动定义这个类型。找啊找,于是找到了ptr_fun。
    这个函数自动将一个函数指针转换为一个binary_function的继承类pointer_to_binary_function,而在
    binary_function中定义了first_argument_type。
    于是修改代码:

    int main(int argc, char *argv[])
    {
        (std::bind1st(std::ptr_fun(print), 
    2))(1);
        
    return 0;
    }

    打印结果如下:
    2---1

  • 相关阅读:
    窗体控件随窗体大小改变(包括字体大小)
    Silverlight数据加载时,等待图标显示与隐藏(Loading)
    鼠标经过时,地图上的每个城市变颜色并且有提示框
    开始博客生活
    光纤
    静态路由配置(Static Routing)
    对称加密与非对称加密
    RIP Debug 过程
    WORD 固定表头自动生成/在Word表格接续页加上重复表格标题
    RIP路由
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3714201.html
Copyright © 2011-2022 走看看