一个快速而肮脏的概念验证:
template <class Source, class Type>
class MyIterator : public std::iterator<std::input_iterator_tag, Type>
{
typedef Type* (Source::*getter_method)(int n);
Source& _inst;
getter_method _getter;
int _index;
bool _end;
Type* _curr_val;
public:
MyIterator(Source& instance, getter_method method, bool end = false)
: _inst(instance), _getter(method), _index(0), _end(end)
{
if (!end)
++*this;
}
void operator++()
{
assert(!_end);
_curr_val = (_inst.*_getter)(_index++);
if (!_curr_val)
_end = true;
}
bool operator!=(MyIterator rhs)
{
return _end != rhs._end;
}
Type& operator*()
{
assert(!_end);
return *_curr_val;
}
};
使用如下实现的对象:
class BaseObject
{
protected:
virtual BaseMember* iterator_getter(int n) = 0;
public:
typedef MyIterator<BaseObject, BaseMember> iterator;
iterator begin()
{
return iterator(*this, &BaseObject::iterator_getter);
}
iterator end()
{
return iterator(*this, &BaseObject::iterator_getter, true);
}
};
和派生对象,如:
class ObjectA : public BaseObject
{
// ...
protected:
virtual BaseMember* iterator_getter(int n)
{
BaseMember* ret;
switch (n)
{
case 0:
ret = &a;
break;
case 1:
ret = &a2;
break;
case 2:
ret = &a3;
break;
// ...
default:
ret = 0;
}
return ret;
}
你怎么看?