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++ 匿名函數(shù) / lambda 表達(dá)式接口:有兩個參數(shù)霹娄、有返回值的匿名函數(shù) / lambda 表達(dá)式,C++ Builder 采用這個接口讓 lambda 表達(dá)式與 Delphi 的匿名函數(shù)兼容。
參數(shù):這個 lambda 表達(dá)式或匿名函數(shù)有兩個參數(shù)栗菜,類型為模板參數(shù) T1 和 T2挑豌,
返回值:為模板參數(shù) TResult 類型纹磺;
- 調(diào)用 _di_TFunc__3::Invoke(); 可以執(zhí)行 lambda 表達(dá)式蕉斜。
- 如果函數(shù)的參數(shù)是這個類型的洒试,可以采用繼承 System::TCppInterfacedObject<TFunc__3<T1, T2, TResult>> 并且重載 Invoke 函數(shù)作為這個參數(shù)來代替 lambda 表達(dá)式硼莽,請參考本文后面及 TThread::CreateAnonymousThread 的例子庶溶。
- 使用 _di_TFunc__3 這個類型需要 clang 編譯器
例1:有個浮點(diǎn)數(shù)數(shù)組,分別用從小到大和從大到小的順序輸出這個數(shù)組里面的數(shù)據(jù)懂鸵,使用 lambda 表達(dá)式:
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 函數(shù),不用 lambda 表達(dá)式矾瑰,采用繼承 System::TCppInterfacedObject<TFunc__3<double, double , int>> 的方法調(diào)用這個函數(shù)
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) // 這里是調(diào)用 lambda 執(zhí)行的內(nèi)容
{
return a > b;
}
};
class TMyProcDesc : public TCppInterfacedObject<TFunc__3<double, double , int>>
{
public:
int __fastcall Invoke(double a, double b) // 這里是調(diào)用 lambda 執(zhí)行的內(nèi)容
{
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]);
}
相關(guān):
- System::Sysutils::_di_TFunc__1
- System::Sysutils::_di_TFunc__2
- System::Sysutils::_di_TFunc__3
- System::Sysutils::_di_TFunc__4
- System::Sysutils::_di_TFunc__5
- System::Sysutils::_di_TPredicate__1
- System::Sysutils::_di_TProc
- System::Sysutils::_di_TProc__1
- System::Sysutils::_di_TProc__2
- System::Sysutils::_di_TProc__3
- System::Sysutils::_di_TProc__4
- System::Sysutils
- System::TCppInterfacedObject
- System::DelphiInterface
- System
- TThread::CreateAnonymousThread
C++ Builder 參考手冊 ? System::Sysutils ? _di_TFunc__3