概述
#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中的每一个值当做了实参进行传入函数中了
如果调用的是仿函数(也就是类中的对()括号进行重载的函数),那么就必须加上括号,如果构造函数需要传参
那么调用的时候也需要写实参,实参的目的是赋给构造函数中的形参,并不是传给仿函数中的形参
仿函数中的形参是由一个个的对象隐式传递的
*/
最后
以上就是苹果泥猴桃为你收集整理的仿函数的简单操作的全部内容,希望文章能够帮你解决仿函数的简单操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复