1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
| // 将本文件保存,例如文件名叫做function.cpp
// 编译:g++ -o test function.cpp -std=c++11
// 运行:./test
#include <functional>
#include <iostream>
struct Foo
{
Foo(int num) : num_(num) {}
void print_num(int i) const { std::cout << "num_:" << num_ << ", i:" << i << std::endl; }
int num_;
};
struct PrintNum
{
void operator()(int i) const
{
std::cout << i << std::endl;
}
static void print_num(int i , int a)
{
std::cout << i << "," << a << std::endl;
}
};
void print_num(int i)
{
std::cout << i << std::endl;
}
void print_num2(int i, int a)
{
std::cout << i << "," << a << std::endl;
}
template <int T_SIZE>
void print_num3(int i, int a)
{
std::cout << i << "," << a << ", T_SIZE:" << T_SIZE << std::endl;
}
void print_num4()
{
std::cout << "print_num4" << std::endl;
}
int main()
{
// 示例1:存储自由函数
std::function<void(int)> FuncFree1 = print_num;
FuncFree1(101);
std::function<void(int, int)> FuncFree2 = print_num2;
FuncFree2(102, 1021);
std::function<void(int, int)> FuncFree3 = print_num3<102333>;
FuncFree3(103, 1031);
std::function<void(int, int)> FuncFree4 = PrintNum::print_num;
FuncFree4(104, 1041);
std::function<void()> FuncFree5 = print_num4;
FuncFree5();
// 示例2:存储 lambda
std::function<void()> FuncLambda1 = []() { print_num(201); };
FuncLambda1();
std::function<void(int)> FuncLambda2 = [](int iNum) { print_num(iNum); };
FuncLambda2(202);
// 示例3:存储到成员函数的调用
std::function<void(const Foo&, int)> FuncFunc = &Foo::print_num;
const Foo xFoo3(300);
FuncFunc(xFoo3, 3011);
FuncFunc(302, 3021); // 由302构造一个Foo对象
// 示例4:存储到数据成员访问器的调用
Foo xFoo4(400);
std::function<int(Foo const&)> FuncData = &Foo::num_;
std::cout << "num_:" << FuncData(xFoo4) << std::endl;
// 示例5:存储到std::bind调用的结果
std::function<void()> FuncBind1 = std::bind(print_num, 501);
FuncBind1();
// 示例6:存储到成员函数及对象的调用
Foo xFoo6(600);
std::function<void(int)> FuncObject = std::bind(&Foo::print_num, xFoo6, std::placeholders::_1);
FuncObject(601);
// 示例7:存储到成员函数和对象指针的调用
Foo xFoo7(700);
std::function<void(int)> FuncPointer = std::bind(&Foo::print_num, &xFoo7, std::placeholders::_1);
FuncPointer(701);
// 示例8:存储到函数对象的调用
std::function<void(int)> FuncOperator = PrintNum();
FuncOperator(801);
}
|