• C++学习笔记(一)mutable function


    今天看代码的过程中,看到一个关键字mutable

    在这儿总结一下:mutable 译义:可变的    也就是与const 作用是相反的

    const强调不可变(为突破const的限制)

    也就有了mutable永远处于可变状态(即使变量处于const函数中)

    function

     通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。

    关于function的使用是从另外一个博客里面转载过来的http://blog.csdn.net/hanbingfengying/article/details/28651507

     1 #include<functional>
     2 #include<iostream>
     3 #include<map>
     4 using namespace std;
     5 
     6 int add(int a, int b) { return a + b; }
     7 auto mod = [](int a, int b) {return a % b;};//lambda表达式
     8 struct divide { 
     9     int operator()(int a, int b) { 
    10         return a / b; 
    11     }
    12 };
    13 
    14 function<int(int, int)> func1 = add;
    15 function<int(int, int)> func2 = mod;
    16 function<int(int, int)>func3 = divide();
    17 
    18 map<string, function<int(int, int)> >funs = {
    19     {"+",add},
    20 {"/",divide()},
    21 {"*",[](int a,int b) {return a * b;}},
    22 {"%",mod}
    23 };
    24 int main() {
    25     cout << func1(1, 2) << endl;
    26     cout << func2(1, 2) << endl;
    27     cout << func3(1, 2) << endl;
    28     cout << funs["+"](4, 9) << endl;
    29     //cout <<  << endl;
    30     system("pause");
    31 }

     1 class CAdd
     2 {
     3 public:
     4     CAdd():m_nSum(0){NULL;}
     5     int operator()(int i)
     6     {
     7         m_nSum += i;
     8         return m_nSum;
     9     }
    10     
    11     int Sum() const
    12     {
    13         return m_nSum;
    14     }
    15     
    16 private:
    17     int m_nSum;
    18 };
    19 int main(int argc, const char * argv[])
    20 {
    21     CAdd cAdd;
    22     function<int(int)> funcAdd1 = cAdd;
    23     function<int(int)> funcAdd2 = cAdd;
    24     cout<<funcAdd1(10)<<endl;
    25     cout<<funcAdd2(10)<<endl;
    26     cout<<cAdd.Sum()<<endl;
    27     
    28      return 0;
    29 }

     输出

     

    上面的输出结果是 10 10 0。我们将同一个函数对象赋值给了两个function,然后分别调用这两个function,但函数中的成员变量的值没有保存,问题在哪里?因为function的缺省行为是拷贝一份传递给它的函数对象,于是f1,f2中保存的都是cAdd对象的拷贝。

    C++11提供了ref和cref函数来提供对象的引用和常引用的包装。要是function能够正确保存函数对象的状态,可以如下修改

     1 class CAdd
     2 {
     3 public:
     4     CAdd() :m_nSum(0) { NULL; }
     5     int operator()(int i)
     6     {
     7         m_nSum += i;
     8         return m_nSum;
     9     }
    10 
    11     int Sum() const
    12     {
    13         return m_nSum;
    14     }
    15 
    16 private:
    17     int m_nSum;
    18 };
    19 int main(int argc, const char * argv[])
    20 {
    21     CAdd cAdd;
    22     function<int(int)> funcAdd1 = ref(cAdd);
    23     function<int(int)> funcAdd2 = ref(cAdd);
    24     cout << funcAdd1(10) << endl;
    25     cout << funcAdd2(10) << endl;
    26     cout << cAdd.Sum() << endl;
    27     system("pause");
    28     return 0;
    29 }

      另外,两个function之间赋值时,如果源function保存的是函数对象的拷贝,则目标function保存的也是函数对象的拷贝。如果源function保存的是对函数对象的引用,则目标function保存的也是函数对象的引用。

    做一个总结:http://blog.csdn.net/wangshubo1989/article/details/49134235

    类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。

    通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function。

    最简单的理解就是:

    通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。

    参考:http://blog.csdn.net/xf_zhen/article/details/52224139

  • 相关阅读:
    断点下载
    根据显示的字符多少来做Label的自适应高度
    iOS中POST异步请求
    iOS中两个APP之间的跳转和通信
    cocoapod [!] /usr/bin/curl -f -L -o /var/folders/dj/yccslvys6tb53k2vz87djfsh0000gn/T/d20170219-12508-z77a4l/file.zip https://github.com/kylefleming/opencv/releases/download/3.1.0-ios-fix/opencv2.fram
    使用webview加载html图片、表单超屏幕问题
    uiwebview 加载html时字体变小 加载前或加载后改变字体大小
    uitabbarController tababr 上方横线隐藏
    uinavigationcontroller uinavigationbar 下方横线去除
    贝赛尔曲线 绘制园
  • 原文地址:https://www.cnblogs.com/lyf-sunicey/p/8128010.html
Copyright © 2020-2023  润新知