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 ){ /*...*/ }.

Q : 、(この場合は) をオーバーライドして、メンバーと対話するだけの標準的な方法operator*()はありますか ?InputIteratorstd::vector<usrStruct>::iteratormyFooa

つまり、

  *first == (*first).a;

したがって、 ?の定義全体に関して直交myFooして機能します。usrStruct

ありがとうございました。

4

2 に答える 2

2

iteratorこれに基づいてdouble値として反映する新しいものを作成でき、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

いいえ、それはできません。構造体を暗黙的にdoubleに変換可能にすることができます(経由operator double)。operator==(usrSruct,double)または、オーバーロードおよび/またはによって直接比較できるようにすることもできますoperator==(double,usrStruct)

于 2012-10-14T08:37:43.880 に答える