自学内容网 自学内容网

[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)!