zoukankan      html  css  js  c++  java
  • #include <boost/function.hpp>

    为atoi取别名fun,fun实质上是函数指针

     1 #include <iostream>
     2 #include <boost/function.hpp>
     3 
     4 void main()
     5 {
     6     boost::function<int(char *)>fun = atoi;//为atoi取别名fun,fun实质上是函数指针
     7 
     8     std::cout << fun("123") + fun("234") << std::endl;
     9 
    10     fun = strlen;
    11 
    12     std::cout << fun("123") + fun("234") << std::endl;
    13 }

    结合boost::bind使用

     1 #include <iostream>
     2 #include <boost/bind.hpp>
     3 #include <boost/function.hpp>
     4 
     5 void main()
     6 {
     7     boost::function<int(char *)>fun;
     8 
     9     fun = boost::bind(strcmp, "ABC", _1);//绑定strcmp,判断和"ABC"是否相同
    10 
    11     std::cout << fun("123") << std::endl;
    12 
    13     std::cout << fun("ABC") << std::endl;
    14 }

    function和bind配合使用可以很方便的实现类成员回调,极好的应用于一些需要回调的场合。

     1 #include <iostream>
     2 #include <boost/bind.hpp>
     3 #include <boost/function.hpp>
     4 
     5 class manager
     6 {
     7 public:
     8     void allstart()
     9     {
    10         for (int i = 0; i < 10; i++)
    11         {
    12             if (workid)
    13             {
    14                 workid(i);
    15             }
    16         }
    17     }
    18     void setcallback(boost::function<void(int)>newid)//绑定调用
    19     {
    20         workid = newid;
    21     }
    22 public:
    23     boost::function<void(int)> workid;
    24 };
    25 
    26 class worker
    27 {
    28 public:
    29     void run(int toid)
    30     {
    31         id = toid;
    32         std::cout << id << "工作" << std::endl;
    33     }
    34 public:
    35     int id;
    36 };
    37 
    38 void main()
    39 {
    40     manager m;
    41     worker w;
    42 
    43     m.setcallback(boost::bind(&worker::run, &w, _1));//绑定
    44     //类的成员函数需要对象来调用,绑定了一个默认的对象
    45 
    46     m.allstart();
    47 }

    ref库

    当在某些情况下需要拷贝对象参数时,如果该对象无法进行拷贝,或者拷贝代价过高,这时候就可以选择ref

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <boost/bind.hpp>
     5 #include <boost/function.hpp>
     6 
     7 void print(std::ostream &os, int i)
     8 {
     9     os << i << std::endl;
    10 }
    11 
    12 void main()
    13 {
    14     boost::function<void(int)>pt = boost::bind(print, boost::ref(std::cout), _1);//std::cout不能拷贝,所以用ref
    15 
    16     std::vector<int>v;
    17     v.push_back(11);
    18     v.push_back(12);
    19     v.push_back(13);
    20 
    21     for_each(v.begin(), v.end(), pt);
    22 }
  • 相关阅读:
    C# List的深复制(转)
    asp.net core控制台项目运行
    进度条界面控件
    给窗体做遮罩(另类做法)
    显示列表控件(引用SourceGrid)
    TimeExit 界面无点击定时退出类
    TimeHelp 获取时间戳转换类
    复旦大学2016--2017学年第一学期高等代数I期末考试情况分析
    复旦大学高等代数历届每周一题汇总
    复旦高等代数 I(16级)每周一题
  • 原文地址:https://www.cnblogs.com/denggelin/p/5767999.html
Copyright © 2011-2022 走看看