std::function and std::bind
std::function
函数(可调用对象)定义方式:
- 会使用函数指针
cpp
int add(int a, int b) { return a + b ; }
int main()
{
typedef int (*Func)(int,int); // 一个函数指针的声明
Func func = add; // func 是类型为 Func 的函数
std::cout << func(1, 2) << std::endl; // 3
return 0;
}
typedef int (*Func)(int, int)
表示Func
类型是指向返回int
的参数为(int, int)
的函数指针,因为一个函数名不是其类型的一部分函数的类型只由它的返回值和参数表决定
- 使用结构体
cpp
struct function_object{
int operator()(int a, int b) { return a + b; }
};
int main()
{
function_object ft;
std::cout << ft(3, 3) << std::endl; // 3
}
- lambda 表达式
cpp
auto add = [](int a, int b){ return a + b; }
std::cout << add(3, 3) << std::endl; // 3
上述调用方式都相同 int(int, int)
,在 C++11 中引入的 std::function
来统一上述函数的使用方式
cpp
int add(int a, int b) { return a + b ; }
int main()
{
std::function<int(int, int)> fun_cxx11 = add;
std::cout << fun_cxx11(1, 2) << std::endl; // 3
return 0;
}
C++11 类模板 std::function
是一个通用的多态函数包装器。
cpp
template<class _Rp, class... _ArgTypes>
class std::__1::function<_Rp (_ArgTypes...)>
闭包
cpp
using FUNC_TYPE = void(int);
void func_decorator(FUNC_TYPE func)
{
std::cout << "start func:" << func << std::endl;
func(2);
std::cout << "end func:" << func << std::endl;
}
int main()
{
auto f = [](int val) { std::cout << val << std::endl; };
func_decorator(f);
return 0;
}