[关闭]
@rulerstorm 2014-08-01T09:19:18.000000Z 字数 1340 阅读 1623

Function模版类


什么是function模版类?

功能上,用于替代c语言中的函数指针。但是这个类提供了更强大地功能,使用上更灵活。
注意:此为c++11中的新标准,在编译时注意加上-std=c++0x的编译选项

强大在哪里?

  1. 函数适配器功能,调整函数参数的数量、顺序。
  2. 有待补充……

基本用法:

  1. void test(int i, double j)
  2. {
  3. cout << i << " " << j << endl;
  4. }
  5. int main(int argc, const char *argv[])
  6. {
  7. //函数test的类型为:void (*) (int, double)
  8. function<void (int, double)> fp;
  9. fp = test;
  10. fp(10, 3.45);
  11. return 0;
  12. }

适配器的实现:

  1. bind()函数。可以固化(绑定)目标函数的行参。(对于类成员函数,可以固化一个对象参数,使其退化为普通函数。)
  2. 占位符。可以在bind时保留部分参数不立即固定,起到减少参数数目、交换参数顺序等适配器功能。

使用范例:

  1. //进阶使用
  2. class Test{
  3. public:
  4. void testfunc(int a, string b, double c){}
  5. };
  6. void basic_func1(int d){}
  7. void basic_func2(int e, double f){}
  8. int main(void){
  9. Test obj; //用于bind
  10. function<void (double, int)> fp; //定义适配器
  11. //这里展示如何bind。提示:使用bind函数时,参数的顺序必须与目标函数一致。
  12. fp = bind(&Test::testfunc, //注意成员函数需要加域空间
  13. &obj, 重要!//类成员函数隐含第一参数为对象指针!!
  14. std::placeholders::_2, //这里是目标函数的int a参数位置
  15. string("hello"), //这里是目标函数的string b参数位置
  16. std::placeholders::_1)
  17. 重要!//占位符表示:绑定以后函数的第一参数会被填到这里。(这里应该填一个double)
  18. //这里展示如何使用fp
  19. fp(3.14, 4); //3.14会作为一个double送到testfunc的第三个参数
  20. //4会作为int a 的传入参数
  21. //testfunc中的string参数被绑定为string("hello"),fp无法修改
  22. //注意fp还绑定了obj对象,testfunc中的this指针都会基于obj这个对象。
  23. //这里补充两个基本使用方法,以免以后看不懂……
  24. function<void (int)> fp2;
  25. fp2 = basic_func1;
  26. fp2(2); //可以直接当basic_func1用了
  27. fp2 = bind(&basic_func2, std::placeholders::_1, 3.14);
  28. fp2(1); //这样就是调用了第二个参数为3.14的basic_func2.
  29. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注