C++函数可调用运算符

一、什么是可调用函数

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;;
}

输出结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值