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 calls
return fac(n);
};
for (int i{5}; i != 8; ++i) {
std::cout << i << "! = " << factorial(i) << "; ";
}
}
代码:
18
5! = 120; 6! = 720; 7! = 5040;