C++可调用对象有哪些

c++ primer可调用对象

如果一个对象可以使用调用运算符(())来调用一个函数,()里面可以放参数,这个对象就是可调用对象。
可调用对象也有类型,例如每个lambda都有他自己唯一(未命名的类型)
我们可以像算法传递任何类别的可调用对象,可调用对象分为以下几种:
1. 函数和函数指针
2. 重载了函数调用运算符的类
3. lambda表达式
4. bind的对象
5. 利用function生成
6. mem_fn生成

不同类型的对象可能有相同的调用形式

函数和函数指针

template<class T>
struct printarray
{
	void operator()(const T& t)const {
		cout << t << endl;
	}
};

void test04()
{
	int ia[] = { 23, 96, 4, 5 };
	qsort(ia, sizeof(ia) / sizeof(int), sizeof(int), fun);
	for_each(ia, ia + sizeof(ia) / sizeof(int), printarray<int>());
}

函数指针的缺点:无法持有自己的状态,也无法达到组件技术中心的可适配性(无法二次修饰,改变状态)

重载Operator()的类对象

	class TestA
	{
	public:
		TestA() {};
		~TestA() {};
		int operator()(int a, int b)
		{
			return a + b;
		};
	private:
	};
	
	void test01()
	{
		TestA a;
		int i = a(5, 7);
	}

STL算法接收的仿函数的就是该方法。要成为可配接的仿函数还需要做更多的事情。这部分在仿函数到底是什么一节中叙述

function生成

function<bool(const string &)> fcn = &string::empty;
vector<int> vecT = { 1,2, 3 };
find_if(vecT.begin(), vecT.end(), fcn);

mem_fn生成

function必须要提供成员的调用形式,可以使用mem_fn让编译器自动生成

vector<int> vecT = { 1,2, 3 };
find_if(vecT.begin(), vecT.end(), mem_fn(&string::empty));

使用bind生成

auto f = find_if(vec.begin(), vec.end(), bind(&string::empty, _1));
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值