如何在C++/CX中迭代IIterable<T>?

5
(这也可以表述为“如何在C++/CX中遍历从C# Windows Runtime组件返回的集合?”) 我尝试在IIterable上使用std :: for_each,但是得到以下编译时错误: 错误C2664:'std :: begin':无法将参数1从'my_collection_type ^'转换为'Platform :: String ^'。没有可用的用户定义的转换运算符,或者指向的类型不相关;转换需要reinterpret_cast,C-style cast或function-style cast。 如何迭代集合?

1
你真的应该添加关于这个错误的错误信息。 - sth
2
@GManNickG:使用C++/CX,而不是C++/CLI。 - James McNellis
1
关闭为“过于局部化”?在我参与的MSDN论坛和邮件列表中,我已经看到了至少十二次相同的问题。这怎么可能是“过于局部化”的呢? - James McNellis
1
@AdelBoutros:询问问题并立即自己回答绝对没有任何问题。一些最好的Stack Overflow答案(例如,关于复制和交换惯用语的优秀帖子)就是以这种方式发布的。Stack Overflow的存在是为了促进信息共享。 - James McNellis
1
很抱歉,我仍然不理解您的立场 :( 为什么关于C++/Cx的问题会发布在stackoverflow元社区上呢? - Jedidja
显示剩余8条评论
3个回答

10

为了使其正常工作,您需要添加

#include "collection.h"
(并且可选)
using namespace Windows::Foundation:Collections

将它添加到你的源代码文件中。

然后,你可以按以下方式迭代整个集合

for_each (begin(my_collection), 
          end(my_collection), 
          [&](my_collection_type^ value) {
          // code goes here...
});

注意:您可能还需要 using namespace std(针对 for_each)。


是否有遗漏include或using语句,因为对我来说for_each、begin和end都未定义。 - The Grand User
啊,那就是被遗漏的部分。 - The Grand User
1
有一个轻微的语法错误。应该是 [&](my_collection_type^ value) { .. }。也就是说,在初始括号后应该使用圆括号。另外,如果您在lambda之外未引用任何外部变量,则括号内的和号不是必需的。 - Weston

10

这也应该可以工作

for (IIterator<T> iter = iterable->First(); iter->HasCurrent; iter->MoveNext())
{
   T item = iter->Current;
}

4

在使用C++/CX编写Windows Runtime组件时,您可以使用类似于C#的语法:

for each (auto item in collection)
{
    item->DoSomething();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接