假设我有一些用户定义的复杂结构,比如
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
的整个定义正交工作?
谢谢。
答案 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)
来进行直接比较。