文章目录
- 前言
- C++函数进化路线
- 代码示例
前言
【C++函数的进化 函数→函数指针→函数模板→仿函数|函数对象→lambda表达式】
观后笔记。
C++函数进化路线
函数->函数指针->函数模板->仿函数(函数对象)->Lambda表达式
代码示例
#include <iostream>
using namespace std;int iData[10] = { 1, 5, 32, 9, 4, 67, 90, 15 ,7, 0 };
//目标找出以上数组中大于50的数,或小于30的数。//普通函数
void PrintLargerData(int* data, int size)
{cout << "大于50的数:";for (int i = 0; i < size; i++){if (data[i] > 50)cout << data[i] << " ";}cout << endl;
}
//函数指针
void PrintTargetData(int* data, int size, bool(*f)(int,int))
{cout << "大于50的数:";for (int i = 0; i < size; i++){if (f(data[i],50))cout << data[i] << " ";}cout << endl;
}bool IsBigger(int i, int j)
{return i>j?true:false;
}
//函数模板
template<typename T, typename Q>
void PrintTargetDataT(T* data, T size, Q(*f)(T, T))
{cout << "大于50的数:";for (T i = 0; i < size; i++){if (f(data[i], 50))cout << data[i] << " ";}cout << endl;
}
//仿函数
class Func
{
public:bool operator()(int i, int j){return i > j ? true : false;}
}func;//仿函数不可以传递给函数指针,因为类型不匹配,所以要重新创建函数模板
template<typename T, typename Q>
void PrintTargetDataTT(T* data, T size, Q q)
{cout << "大于50的数:";for (T i = 0; i < size; i++){if (q(data[i], 50))cout << data[i] << " ";}cout << endl;
}
int main()
{cout << "普通函数" << endl;PrintLargerData(iData,sizeof(iData)/sizeof(int));cout << "函数指针" << endl;PrintTargetData(iData, sizeof(iData) / sizeof(int), IsBigger); //这样主要函数入口不变,每次传入不同的判断条件即可。cout << "函数模板" << endl;PrintTargetDataT<int, bool>(iData, sizeof(iData) / sizeof(int), IsBigger);//升级为函数模板以后,不再局限于单一的数据类型了。cout << "仿函数" << endl;PrintTargetDataTT<int, Func>(iData, sizeof(iData) / sizeof(int), func);cout << "Lambda表达式" << endl;PrintTargetDataT<int, bool>(iData, sizeof(iData) / sizeof(int), [](int a, int b)->bool { return a > b ? true : false; });//Lambda本身可以看作一个函数指针,所以可以直接传入。
}