C++/Cli 中Linq 的替代实现, 不干净

来源:互联网 发布:php代码编写 编辑:程序博客网 时间:2024/05/02 00:06

C++11中lamda表达式由编译器编译为函数对象, 即 是一个对象, 而C#中的lamda表达式解释为delegate, 即函数指针, 故不能通用.

如果要在C++/Cli中使用 类似 C# 中的 .Select<TSource, TResult> 只能gcnew delegate

ListView ^ listView = gcnew ListView;

ListViewItem ^ item1 = gcnew ListViewItem; item->Tag = System::IntPtr(pFoo1);

ListViewItem ^ item2 = gcnew ListViewItem; item->Tag = System::IntPtr(pFoo2);

... ...

要得到 IEnumable<System::IntPtr> :

IEnumable<System::IntPtr> ^ ptrList = 

System::Linq::Enumerable::Select<ListViewItem^, System::IntPtr>(

System::Linq::Enumerable::Cast<ListViewItem ^>(listView1->SelectedItems), 

gcnew System::Func<ListViewItem^, System::IntPtr>(toIntPtr);


需要额外定义函数

System::IntPtr toIntPtr(ListViewItem ^ item) { return (System::IntPtr)item->Tag; }


0 0
原创粉丝点击