Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在SAFEARRAY上实现每个_C++_C++11_Com - Fatal编程技术网

C++ 在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是您希望数

我以前没有实现过基于范围的for机制,我很好奇这对SAFEARRAY会起什么作用

一个可能的用例是希望从
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的回答似乎不错,巧妙地避开了变量类型的尴尬,尽管我想知道模板解决方案是否可行。。。但是一次发生的事情太多了,我很难知道从哪里开始。