c++可调用对象的几种定义
1.是一个函数指针
2.是一个具有operator()成员函数的类对象(仿函数)
3.是一个可被转换为函数指针的类对象
4.是一个类成员变量指针
5.是一个类成员函数指针
void func() {}
struct Foo
{
void operator () (void){
}
};
struct Foo2
{
using cb = void(*)(int);
static void func(int m){
cout << "Foo2 " << m << endl;
}
operator cb(){
return func;
}
};
struct Foo3
{
int a;
void func(){}
};
void(*pcb)() = &func; //函数指针
pcb();
Foo foo;
foo(); //仿函数
Foo2 foo2;
foo2(3); //可被转换为函数指针的类对象
void(Foo3::*pmemfun)() = &Foo3::func; //类成员函数指针
int Foo3::*pmemobj = &Foo3::a; //类成员变量指针
Foo3 foo3;
(foo3.*pmemfun)();
foo3.*pmemobj = 123;
c++11的std::function是可调用对象的包装器,可以容纳除类成员变量指针,类成员函数指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理,保存和延迟执行它们。std::function的使用如下:
std::function<void()> pcb = func; //绑定普通函数
pcb(); //func
Foo foo;
std::function<void()> pfoo = foo; //绑定仿函数
pfoo(); //Foo
Foo2 foo2;
std::function<void(int)> pfoo2 = foo2; //绑定被转换为函数指针的类对象
pfoo2(3); //Foo2 3
std::function<void(int)> pfoo3 = Foo2::func; //绑定静态成员函数
pfoo3(4); //Foo2 4