一、什么是可调用函数
func()这就是一个可调用函数,某类重载了operator(),这个类对象也称为可调用函数(可调用对象), 他们的明显标志是带有圆括号。
class A {
public:
A(int var)
{
cout << "构造函数var=" << var << endl;
};
//重载()后可以向调用函数一样调用类对象
int operator()(int var)
{
return var > 0 ? var : 0;
}
//重载()两参数版本
int operator()(int x, int y) {
return x > y ? x : y;
}
};
int MyFun(int var)
{
return var > 0 ? var : 0;
}
void main()
{
A obj(10);//调用构造函数
int result=obj(200);//调用operator()
//也可以写成一下形式
int result2=obj.operator()(200);
}
二、Function类型
不同函数有相同的返回类型和参数,这些函数的调用形式相同,我们可以将其添加到 map中方便调用
void Call_Function_map()
{
A obj(10);//构造函数在这里调用
function<int(int)> f1 = obj;
function<int(int)> f2 = MyFun;
map<string, function<int(int)>> mymap{ {"ClassA", f1} ,{"ClassB", f2} };
cout << mymap["ClassA"](20) << endl;;
cout << mymap["ClassB"](30) << endl;;
}
注意:类operator()可以重载多个版本不影响赋值给function。【但普通函数和自定义的成员函数有多个重载时,则不能直接赋值给function,需使用函数指针进行转换】
class A {
public:
A(int var)
{
cout << "构造函数var=" << var << endl;
};
//重载()后可以向调用函数一样调用类对象
int operator()(int var)
{
return var > 0 ? var : 0;
}
//重载()两参数版本
int operator()(int x, int y) {
return x > y ? x : y;
}
};
int MyFun(int var)
{
return var > 0 ? var : 0;
}
int MyFun(int var,int value)
{
return var > 0 ? var : 0;
}
void main()
{
A obj(10);//构造函数在这里调用
function<int(int)> f1 = obj;
//函数指针
int(*p1)(int) = MyFun;
//直接使用函数指针
map<string, function<int(int)>> mymap{ {"A", f1} ,{"B", p1} };
//或转为function类型
function<int(int)> f2 = p1;
map<string, function<int(int)>> mymap{ {"A", f1} ,{"B", f2} };
cout << mymap["A"](20) << endl;;
cout << mymap["B"](30) << endl;;
}
输出结果