今天看代码的过程中,看到一个关键字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