c++ - 在 SAFEARRAY 上实现 for-each

标签 c++ c++11 com

我之前没有实现基于范围的 for 机制,并且很好奇这对 SAFEARRAY 有何作用。

一个可能的用例是想要填充 std::vector来自SAFEARRAY * .你需要包装 SAFEARRAY例如,在提供特殊迭代器的自定义类中?

一个问题是 SAFEARRAY可以包含不同的类型。假设您映射了 string <--> BSTR、int <--> I4 和所有其他类型均无效,您如何设置类似:for(string s : MySafeArray) 的内容? ?

我们已经有了一个包装类:template <class T> SafeArrayWrapper{...}其中 T是您希望将数组内容视为的类型。

最佳答案

好吧,实现从 SAFEARRAY 枚举字符串或整数的能力的最简单方法是在安全数组中创建两个集合类,一个代表字符串,另一个代表整数。

这里有一些东西可能代表可枚举的字符串集合。

class SafeArrayStringList {
public:
  SafeArrayStringList(SAFEARRAY);
  class iterator;
  iterator begin();
  iterator end();
};

对此至关重要的是迭代器的(前向)声明,以及 being() 和 end() 方法,当您在其中一个上使用基于范围的 for 循环时,C++ 将寻找这些方法。

迭代器的定义如下:

class SafeArrayStringList::iterator {
  SAFEARRAY _array;
  int _idx;
public:
  iterator(SAFEARRAY);
  iterator& operator++();
  bool operator!=(const iterator& rhs);
  std::string operator*();
};

这几乎是您(在 XCode 上)满足基于范围的 for 循环要求的全部内容。

如果操作得当,您应该让迭代器扩展 std::iterator 类,但为了清晰起见,我删除了所有实际不需要的内容。

要枚举 SAFEARRAY 中的字符串,您需要

for(auto stringitem : SafeArrayStringList(safeArray){
  std::string foo = *stringitem;
} 

关于c++ - 在 SAFEARRAY 上实现 for-each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33303997/

相关文章:

c++ - 我可以抛出一个 unique_ptr 吗?

c++ - 使用 C++ 和 RGBA 像素 vector 的双线性调整大小

c++ - 找到最小的数字,该数字不为零

c++ - 使用 C++ 尾随返回类型时 auto 是什么意思?

c++ - 无法将 std::bind 返回值分配给 std::function

c++ - 初始化 COM C++ 服务多线程的正确方法

c++ - 如何在不重载纯虚函数的情况下将抽象类转换为普通类?

c++ - 如何从自动返回类型推导出类型?

java - ntdll.dll 是 Windows XP 和 Windows Vista 的标准配置吗?

c# - 使用 C# 中的动态 com 互操作处理来自 Word 的事件