1 可调用对象
在 C++ 中,可调用对象一般是指:
- 一个函数指针
- 一个重载 () 操作符的类对句(仿函数)
- 一个可被转换为函数指针的类对象
- 一个类成员函数指针
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 |
#include <iostream> void func(void) { std::cout<<"func(void) called"<<std::endl; } struct Foo { void operator()(void) { std::cout<<"Foo::()(void) called"<<std::endl; } }; struct Bar { using ft_t = void(*)(void); static void func(void) { std::cout<<"Bar::func(void) called"<<std::endl; } operator ft_t(void) { return func; } }; struct A { int m_a; void mem_func(void) { std::cout<<"A:memfunc(void) called and m_a="<<m_a<<std::endl; } }; int main() { //1.函数指针 void(* func_ptr)(void) = &func; func_ptr(); //2.仿函数 Foo foo; foo(); //3.可被转换为函数指针的类对象 Bar bar; bar(); //4.类成员函数指针或类成员指针 void (A::*mem_func_ptr)(void) = &A::mem_func; int A::*mem_obj_ptr = &A::m_a; A aa; (aa.*mem_obj_ptr) = 123; (aa.*mem_func_ptr)(); return 0; } |
上例中的这些对象(func_ptr,foo,bar,mem_func_ptr,mem_obj_ptr) 均可称之为 “可调用对象”。相应的,其类型可被称作“可调用类型”。注意这里只有成员函数有成员函数指针而没有函数类型或函数引用类型,这是因为函数类型并不能直接用于定义对象,而函数引用或以看做一个 const 的函数指针。 可调用对象具有比较统一的调用形式,即使用括号操作(除成员函数指针),而定义的方法各不一样。这样我们在试图使用统一的方式保存,或传递一个可调用对象时,会十分烦琐。
2 std::function 可调用对象包装器
std::function 是一个类模板,它可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟调用它们。
继续阅读