【问题标题】:How do I iterate over an IIterable<T> in C++/CX?如何在 C++/CX 中迭代 IIterable<T>?
【发布时间】:2012-06-19 22:36:43
【问题描述】:

(这也可以表述为“如何迭代从 C++/CX 中的 C# Windows 运行时组件返回的集合?”)

我尝试在IIterable&lt;T&gt; 上使用std::for_each,但得到以下编译时错误

错误 C2664:“std::begin”:无法将参数 1 从 'my_collection_type ^' 到 'Platform::String ^' 否 用户定义的转换运算符可用,或类型 指出是不相关的;转换需要 reinterpret_cast, C 风格转换或函数风格转换

如何迭代集合?

【问题讨论】:

  • 你真的应该添加这个错误信息。
  • @GManNickG:C++/CX,不是 C++/CLI。
  • 关闭为“过于本地化”?在过去的九个月里,我在我参与的 MSDN 论坛和邮件列表上看到了至少十几次同样的问题。这怎么会“过于本地化”?
  • @AdelBoutros:提出问题并立即自己回答绝对没有错。 Stack Overflow 上的一些最佳答案(例如,the excellent post on the copy-and-swap idiom)就是以这种方式发布的。 Stack Overflow 的存在是为了促进信息共享。
  • @AdelBoutros 不幸的是我还是不明白你的立场:(为什么关于 C++/Cx 的问题会发布在 stackoverflow meta 上?

标签: windows-runtime c++-cx


【解决方案1】:

这也应该有效

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

【讨论】:

    【解决方案2】:

    为此,您需要添加

    #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)。

    【讨论】:

    • 是否有包含或使用缺失,因为 for_each、begin 和 end 对我来说都是未定义的
    • 啊,这就是被遗漏的内容
    • 有一点语法错误。它应该是 [&](my_collection_type^ value) { .. }。也就是说,它应该在最初的括号集之后使用括号。此外,如果您没有引用 lambda 之外的任何外部变量,则不需要括号内的 &。
    【解决方案3】:

    在 C++/CX 中编写 Windows 运行时组件时,您可以使用类似 C# 的构造:

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

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2013-05-12
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多