c++中存在“可调用对象(Callable Objects)”这样一个概念。
可定义为以下几种:
1. 是一个函数指针
2. 是一个具有 operator() 成员函数的类对象(仿函数)
3. 是一个可被转换为函数指针的类对象
4. 是一个类成员(函数)指针
#include <iostream>
using namespace std;
void func(void)
{
//...
cout << "void func" << endl;
}
struct Foo
{
void operator()(void)
{
//...
cout << "Foo struct" << endl;
}
};
struct Bar
{
using fr_t = void(*)(void);
static void func(void)
{
//...
cout << "Bar func" << endl;
}
operator fr_t(void)
{
cout << "Bar fr_t" << endl;
return func;
}
};
struct A
{
int a_;
void mem_func(void)
{
//...
cout << "A struct mem_func" << endl;
}
};
int main(void)
{
void(*func_ptr)(void) = &func; //1.函数指针
func_ptr();
Foo foo; //2.仿函数
foo();
Bar bar; //3. 可被转换为函数指针的类对象
bar();
void (A::*mem_func_ptr)(void) = &A::mem_func; //4.类成员函数指针
int A::*mem_obj_ptr = &A::a_; // 或者是类成员指针
A aa;
(aa.*mem_func_ptr)();
aa.*mem_obj_ptr = 123;
return 0;
}
运行结果:
上面涉及的对象均可像一个函数那样做调用操作,这些对象(func_ptr、foo、bar、mem_func_ptr、mem_obj_ptr)都被称作可调用对象,这些对象的类型被称作“可调用类型”。
C++11通过提供std::function和std::bind统一了可调用对象的各种操作。
std::function---------可调用对象包装器
它是一个类模板。可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。