函数调用运算符
如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象。
函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符。
struct absint {
int operator()(int val)
{
return val < 0 ? -val : val;
}
};
int x = -7;
absint absobj;//含有函数调用运算符的对象
int xu = absobj(x);
cout << xu << endl;
可调用对象
调用形式:调用形式指明了调用返回的类型以及传递给调用的实参类型。
一种调用形式对应一个函数类型。
int(int, int)//一个函数类型,接受两个int,返回一个int
不同类型可能具有相同的调用形式
以下都共享了一种调用形式int(int,int)
int add(int a, int b){return a+b;}//普通函数
auto mod = [](int a, int b){return a%b;}//lambda表达式
struct divide {
int operator()(int a, int b) { return a / b; }
};//函数对象类
function类型
function类型可以用来存储可调用对象的指针,定义在头文件functional中
function<T> f:f是一个用来存储可调用对象的空function
result_type:该function类型的可调用对象的返回类型
argument_type:当T有一个或两个实参时定义的类型。如果T只有一个实参,则argument_type是该类型的同义词,如果T有两个实参,则first_argument_type和second_argument_type分别代表两个实参的类型。
不能将重载函数的名字存入function类型对象中,可以使用函数指针或lambda
function<int(int, int)> f;
f = divide();
cout << f(8, 2) << endl;
function<int(int, int)>f2;
f2 = [](int a, int b) {return a%b; };
cout << f2(17, 10) << endl;
function类型可以存放在容器中
map<string, function<int(int, int)>> binpos = {
{"%",divide() },
{"+",[](int a, int b) {return a+b; } },
};
cout << binpos["+"](4, 5) << endl;
cout << binpos["%"](18, 10) << endl;
为了解决二义性,不要直接将函数的名字存入function中,最好是存储函数指针,或存入lambda表达式
int(*fp)(int, int) = add;//add为一个函数名
binpos.insert({ "+",fp });