我之前没有实现基于范围的 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/