我是靠谱客的博主 苹果泥猴桃,最近开发中收集的这篇文章主要介绍仿函数的简单操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include<iostream>
#include<vector>
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
class C_Print
{
public:
	void operator()(int &ele)
	{
		cout << ele << endl;
	}
};


class C_Add
{
private:
	int m_ele;
public:
	C_Add(int value)
	{
		m_ele = value;
	}
	void operator()(int &value)
	{
		value += m_ele;
	}

};


void PrintElem(int elem, const char* prefix)
{
	cout << prefix << elem << endl;
}

void Print(int ele)				//必须有一个形参
{
	cout << ele << endl;
}
int main()
{
	int iArr[] = { 1,2,3 };
	vector<int> myVec(iArr, iArr + sizeof(iArr) / sizeof(iArr[0]));
	cout << "调用全局函数传入两个参数" << endl;
	for_each(myVec.begin(), myVec.end(), bind2nd(ptr_fun(PrintElem),"Element:a"));//需要转成function object
	for_each(myVec.begin(), myVec.end(), Print);	//不需要加括号了,因为调用的是全局函数,不是()重载函数
	cout << "不传入参数" << endl;
	for_each(myVec.begin(), myVec.end(), C_Print());
	cout << "传入一个参数(传入的参数用于初始化类中的成员变量了)" << endl;
	for_each(myVec.begin(),myVec.end(),C_Add(2));	
	//解析:
	/*
		for_each(myVec.begin(),myVec.end(),C_Add(2));
		该函数是怎么调用的??
		首先调用C_Add类的构造函数,将2赋值给类中的成员变量m_ele,然后才是调用operator() 
		重载函数,将一个个对象作为函数的实参传给重载函数的形参,然后在函数中进行操作才
		导致改变了原来数据中的值



	*/
	for_each(myVec.begin(), myVec.end(), C_Print());
	system("pause");
}

/*
	只要使用for_each(first,last,fun) 第三个参数的函数定义必须有一个参数,调用的时候可以不进行传参
	如果调用的是全局函数也可以不写()括号,只写一个函数名就可以了
	因为for_each(first,last,fun) 中的隐式的就将first到last中的每一个值当做了实参进行传入函数中了

	如果调用的是仿函数(也就是类中的对()括号进行重载的函数),那么就必须加上括号,如果构造函数需要传参
	那么调用的时候也需要写实参,实参的目的是赋给构造函数中的形参,并不是传给仿函数中的形参
	仿函数中的形参是由一个个的对象隐式传递的
*/

最后

以上就是苹果泥猴桃为你收集整理的仿函数的简单操作的全部内容,希望文章能够帮你解决仿函数的简单操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部