[C++] C++函数的进化: 函数->函数指针->函数模板->仿函数(函数对象)->Lambda表达式
前言
【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本身可以看作一个函数指针,所以可以直接传入。
}
原文地址:https://blog.csdn.net/zlllc/article/details/136545088
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!