覆盖迭代器的运算符*()

时间:2012-10-14 08:27:09

标签: c++ iterator

假设我有一些用户定义的复杂结构,比如

struct usrStruct{
     double a;
     T1 b;
     T2 c;
     /* and so on...*/
}

用作std :: vector,std :: list或任何 iterable 的基本元素..

假设std::vector<usrStruct>通过迭代器传递给我的函数

  template<class InputIterator>  
  T myFoo( InputIterator first, InputIterator last ){ /*...*/ }.

:是否有标准方法可以覆盖operator*()的{​​{1}},(在InputIterator}的情况下)std::vector<usrStruct>::iterator只是与成员myFoo进行交互?

即,

a

因此 *first == (*first).a; myFoo的整个定义正交工作?

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以根据iterator创建一个新的vector::iterator,并将其反映为双倍值,这非常简单:

template< class BaseIterator >
struct custom_iterator :
    std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double>
{
public:
    typedef std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double>
        base_t;
    typedef typename base_t::reference reference;
public:
    custom_iterator( BaseIterator it ) : m_it( it ) {}
public:
    reference operator*() const {
        return my_it->a;
    }
    custom_iterator& operator++ () {++m_it; return *this;}
    custom_iterator operator++ (int) {
        custom_iterator tmp( *this );
        ++m_it;
        return *this;
    }
    bool operator==( custom_iterator const& rhs ) const {
        return m_it == rhs.m_it;
    }
private:
    BaseIterator m_it;
};

现在您可以将其用作myFoo( custom_iterator(v.begin()), custom_iterator(v.end()) )

答案 1 :(得分:1)

不,你不能这样做。您可以将结构隐式转换为double(通过operator double)。或者,您可以通过重载operator==(usrSruct,double)和/或operator==(double,usrStruct)来进行直接比较。