在 C++ 中存在 “可调用对象” 这么一个概念。准确来说,可调用对象有如下几种定义:
是一个函数指针:
int print(int a, double b)
{
cout << a << b << endl;
return 0;
}
// 定义函数指针
int (*func)(int, double) = &print;
是一个具有operator()成员函数的类对象(仿函数)
#include#include #include using namespace std; struct Test { // ()操作符重载 void operator()(string msg) { cout << "msg: " << msg << endl; } }; int main(void) { Test t; t("Helloword!!!"); // 仿函数 return 0; }
是一个可被转换为函数指针的类对象
#include#include #include using namespace std; using func_ptr = void(*)(int, string); struct Test { static void print(int a, string b) { cout << "name: " << b << ", age: " << a << endl; } // 将类对象转换为函数指针 operator func_ptr() { return print; } }; int main(void) { Test t; // 对象转换为函数指针, 并调用 t(19, "Monkey D. LIHUA"); return 0; }
是一个类成员函数指针或者类成员指针
#include#include #include using namespace std; struct Test { void print(int a, string b) { cout << "name: " << b << ", age: " << a << endl; } int m_num; }; int main(void) { // 定义类成员函数指针指向类成员函数 void (Test::*func_ptr)(int, string) = &Test::print; // 类成员指针指向类成员变量 int Test::*obj_ptr = &Test::m_num; Test t; // 通过类成员函数指针调用类成员函数 (t.*func_ptr)(19, "Monkey D. Luffy"); // 通过类成员指针初始化类成员变量 t.*obj_ptr = 1; cout << "number is: " << t.m_num << endl; return 0; }
在上面的例子中满足条件的这些可调用对象对应的类型被统称为可调用类型。C++ 中的可调用类型虽然具有比较统一的操作形式,但定义方式五花八门,这样在我们试图使用统一的方式保存,或者传递一个可调用对象时会十分繁琐。现在,C++11通过提供std::function 和 std::bind统一了可调用对象的各种操作。
关注我,带你感受Cpp



