_di_TFunc__3 - C++ Builder

2022-06-24  本文已影响0人  玄坴

C++ Builder 参考手册System::Sysutils_di_TFunc__3


头文件:#include <System.SysUtils.hpp>
命名空间:System::Sysutils
类型定义:

template<typename T1, typename T2, typename TResult> using _di_TFunc__3 = System::DelphiInterface<TFunc__3<T1, T2, TResult>>;

C++ 匿名函数 / lambda 表达式接口:有两个参数、有返回值的匿名函数 / lambda 表达式,C++ Builder 采用这个接口让 lambda 表达式与 Delphi 的匿名函数兼容。


参数:这个 lambda 表达式或匿名函数有两个参数,类型为模板参数 T1 和 T2,
返回值:为模板参数 TResult 类型;



例1:有个浮点数数组,分别用从小到大和从大到小的顺序输出这个数组里面的数据,使用 lambda 表达式:

void TForm1::MyFunc(double *pArray, int iCount, _di_TFunc__3<double, double, int> pLambda)
{
    for(int iMin=0; iMin<iCount-1; iMin++)
    {
        for(int iFind=iMin+1; iFind<iCount; iFind++)
        {
            if(pLambda->Invoke(pArray[iMin], pArray[iFind]) > 0)
            {
                double tmp = pArray[iMin];
                pArray[iMin] = pArray[iFind];
                pArray[iFind] = tmp;
            }
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    double a[8] = { 1.23, 0.69, 3.14, 2.72, 0.02, 9.65, 7.34, 3.33 };

    MyFunc(a, 8, [&](double a, double b)->int { return a > b; });

    Memo1->Lines->Add(L"从小到大:");
    for(int i=0; i<8; i++)
        Memo1->Lines->Add(a[i]);

    MyFunc(a, 8, [&](double a, double b)->int { return a < b; });

    Memo1->Lines->Add(L"从大到小:");
    for(int i=0; i<8; i++)
        Memo1->Lines->Add(a[i]);
}
运行结果

例2:依然是前面例1的 MyFunc 函数,不用 lambda 表达式,采用继承 System::TCppInterfacedObject<TFunc__3<double, double , int>> 的方法调用这个函数

void TForm1::MyFunc(double *pArray, int iCount, _di_TFunc__3<double, double, int> pLambda)
{
    for(int iMin=0; iMin<iCount-1; iMin++)
    {
        for(int iFind=iMin+1; iFind<iCount; iFind++)
        {
            if(pLambda->Invoke(pArray[iMin], pArray[iFind]) > 0)
            {
                double tmp = pArray[iMin];
                pArray[iMin] = pArray[iFind];
                pArray[iFind] = tmp;
            }
        }
    }
}

class TMyProcAsc : public TCppInterfacedObject<TFunc__3<double, double , int>>
{
public:
    int __fastcall Invoke(double a, double b) // 这里是调用 lambda 执行的内容
    {
        return a > b;
    }
};

class TMyProcDesc : public TCppInterfacedObject<TFunc__3<double, double , int>>
{
public:
    int __fastcall Invoke(double a, double b) // 这里是调用 lambda 执行的内容
    {
        return a < b;
    }
};

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    double a[8] = { 1.23, 0.69, 3.14, 2.72, 0.02, 9.65, 7.34, 3.33 };

    MyFunc(a, 8, new TMyProcAsc); // 用 TMyProcAsc 对象代替 lambda,自动销毁

    Memo1->Lines->Add(L"从小到大:");
    for(int i=0; i<8; i++)
        Memo1->Lines->Add(a[i]);

    MyFunc(a, 8, new TMyProcDesc); // 用 TMyProcDesc 对象代替 lambda,自动销毁

    Memo1->Lines->Add(L"从大到小:");
    for(int i=0; i<8; i++)
        Memo1->Lines->Add(a[i]);

}

相关:


C++ Builder 参考手册System::Sysutils_di_TFunc__3

上一篇下一篇

猜你喜欢

热点阅读