app扁平化设计网站深圳云购网站制作
C++笔记之通用多态函数包装器std::function
code review!
 
文章目录
- C++笔记之通用多态函数包装器std::function
 - 1.存储自由函数,lambda,std::bind 调用的结果
 - 2.存储到成员的调用
 - 3.存储到函数对象
 - 四.基本语法
 - 五.使用std::function定义函数对象
 - 六.使用std::function结合Lambda表达式定义函数对象
 - 七.使用std::function实现回调机制——略,有专门新开笔记介绍。
 
1.存储自由函数,lambda,std::bind 调用的结果

代码
#include <functional>
#include <iostream>void print_num(int i) {std::cout << i << '\n';
}int main() {std::cout << "存储自由函数---1" << std::endl;std::function<void(int)> f_display = print_num;f_display(-9);std::cout << "存储 lambda--2" << std::endl;std::function<void()> f_display_42 = []() { print_num(42); };f_display_42();std::cout << "存储到 std::bind 调用的结果--3" << std::endl;std::function<void()> f_display_31337 = std::bind(print_num, 31337);f_display_31337();
}
 
运行:
 存储自由函数—1
 -9
 存储 lambda–2
 42
 存储到 std::bind 调用的结果–3
 31337
2.存储到成员的调用

代码
#include <functional>
#include <iostream>struct Foo {Foo(int num) : num_(num) {}void print_add(int i) const { std::cout << num_ + i << '\n'; }int num_;
};int main() {const Foo foo(314159);foo.print_add(1);std::cout << "存储到成员函数的调用---1" << std::endl;std::function<void(const Foo &, int)> f_add_display = &Foo::print_add;f_add_display(foo, 1);f_add_display(314159, 1);std::cout << "存储到数据成员访问器的调用---2" << std::endl;std::function<int(Foo const &)> f_num = &Foo::num_;std::cout << "num_: " << f_num(foo) << '\n';std::cout << "存储到成员函数及对象的调用---3" << std::endl;using std::placeholders::_1;std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);f_add_display2(2);
}
 
运行:
 314160
 存储到成员函数的调用—1
 314160
 314160
 存储到数据成员访问器的调用—2
 num_: 314159
 存储到成员函数及对象的调用—3
 314161
3.存储到函数对象

#include <functional>
#include <iostream>struct PrintNum {void operator()(int i) const {std::cout << i << '\n';}
};int main() {// 存储到函数对象的调用std::function<void(int)> f_display_obj = PrintNum();f_display_obj(18);auto factorial = [](int n) {// 存储 lambda 对象以模拟“递归 lambda ”,注意额外开销std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); };// note that "auto fac = [&](int n){...};" does not work in recursive callsreturn fac(n);};for (int i{5}; i != 8; ++i) {std::cout << i << "! = " << factorial(i) << ";  ";}
}
 
代码:
 18
 5! = 120; 6! = 720; 7! = 5040;
四.基本语法

五.使用std::function定义函数对象

六.使用std::function结合Lambda表达式定义函数对象

