2

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

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

它用作 std::vector、std::list 或任何可迭代对象的基本元素。

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

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

:有没有一种标准的方法来覆盖operator*(), (在 InputIterator这种情况下std::vector<usrStruct>::iterator),以便 与成员交互myFooa

即,这样

  *first == (*first).a;

因此与?的整个定义正交myFoo工作usrStruct

谢谢你。

4

2 回答 2

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()) )

于 2012-10-14T09:22:46.567 回答
1

不,你不能那样做。您可以使您的结构隐式转换为双精度(通过operator double)。或者,您可以通过重载operator==(usrSruct,double)和/或operator==(double,usrStruct).

于 2012-10-14T08:37:43.880 回答