C++ 在SAFEARRAY上实现每个
我以前没有实现过基于范围的for机制,我很好奇这对SAFEARRAY会起什么作用 一个可能的用例是希望从C++ 在SAFEARRAY上实现每个,c++,c++11,com,C++,C++11,Com,我以前没有实现过基于范围的for机制,我很好奇这对SAFEARRAY会起什么作用 一个可能的用例是希望从SAFEARRAY*填充std::vector。您是否需要将SAFEARRAY包装到一个自定义类中,例如提供特殊迭代器 一个问题是SAFEARRAY可以包含不同的类型。假设您映射的字符串BSTR、int I4和所有其他类型无效,您如何设置如下内容:for(string s:MySafeArray) 我们已经有了一个包装类:template SafeArrayWrapper{…}其中T是您希望数
SAFEARRAY*
填充std::vector
。您是否需要将SAFEARRAY
包装到一个自定义类中,例如提供特殊迭代器
一个问题是SAFEARRAY
可以包含不同的类型。假设您映射的字符串BSTR、int I4和所有其他类型无效,您如何设置如下内容:for(string s:MySafeArray)
我们已经有了一个包装类:template SafeArrayWrapper{…}
其中T
是您希望数组内容被视为的类型。您需要创建:
运算符*
、运算符+
和运算符=代码>重载。使其成为一个子类型
开始(SAFEARRAY&)
和结束(SAFEARRAY&)
,以及它们的常量
变体
#include <vector>
#include <iterator>
struct Foo
{
std::vector<int> vec_;
};
struct FooIterator : std::iterator<std::forward_iterator_tag, int>
{
FooIterator(Foo& f) : foo_(f), iter_(f.vec_.begin()) {}
FooIterator& end() { iter_ = foo_.vec_.end(); return *this; }
int& operator*() { return *iter_; }
std::vector<int>::iterator operator++() { return ++iter_; }
bool operator!=(FooIterator const& rhs) const { return iter_ != rhs.iter_; }
Foo& foo_;
std::vector<int>::iterator iter_;
};
FooIterator begin(Foo& foo)
{
return FooIterator(foo);
}
FooIterator end(Foo& foo)
{
return FooIterator(foo).end();
}
int main()
{
Foo foo;
for ( auto f : foo )
{
}
return 0;
}
#包括
#包括
结构Foo
{
std::向量向量向量;
};
struct FooIterator:std::iterator
{
FooIterator(Foo&f):Foo_f(f),iter_f(f.vec_u.begin()){}
FooIterator&end(){iter_uz=foo_u.vec_u.end();返回*this;}
int&运算符*(){return*iter}
std::vector::迭代器运算符++(){return++iter_;}
布尔运算符!=(FooIterator const&rhs)const{return iter_!=rhs.iter_;}
富和富;
std::vector::迭代器iter;
};
Foo迭代器begin(Foo&Foo)
{
返回foo迭代器(foo);
}
Foo迭代器端(Foo&Foo)
{
返回FooIterator(foo.end();
}
int main()
{
富富,;
用于(自动f:foo)
{
}
返回0;
}
好的,从SAFEARRAY枚举字符串或整数的最简单方法是在SAFEARRAY中创建两个集合类,一个表示字符串,另一个表示整数
下面是一些可能表示字符串的可枚举集合的内容
class SafeArrayStringList {
public:
SafeArrayStringList(SAFEARRAY);
class iterator;
iterator begin();
iterator end();
};
这是一个迭代器的声明,以及一个Bein()和Enter()方法,当使用一个基于范围的循环时,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语言类型的C++语法永远不会让你在任何地方得到。我想这个世界还需要一个C++包装类,你必须写一个。我不知道为什么这个问题会被认为是“太宽”。这对我来说似乎很具体。。。SAFAREAR的设计提出了一些特殊的细微差别。你需要解释为什么你不知道如何写一个C++包装器。至少写一篇文章,让我们知道你需要什么样的帮助。我没有说我不知道怎么做。我问是否需要一个。我还解释了基于范围的for不是我熟悉的东西。。。我不知道如何将其放入我的包装中,因为SAFEARRAY有点特殊。Chris的回答似乎不错,巧妙地避开了变量类型的尴尬,尽管我想知道模板解决方案是否可行。。。但是一次发生的事情太多了,我很难知道从哪里开始。