I would like to do something like this:
container::iterator it = NULL;
switch ( eSomeEnum )
{
case Container1:
it = vecContainer1.begin();
break;
case Container2:
it = vecContainer2.begin();
break;
...
}
for( ; it != itEnd ; ++it )
{
..
}
But I can't create and initialise an iterator to NULL. Is there some way I can do this? Ideally I would just create and assign the iterator in the switch, but then it would go out of scope immediately.
You just needn't initialize it at all, because iterators are DefaultConstructible.
All you should need to do is change
container::iterator it = NULL;
to
container::iterator it;
and I think your code will work as intended.
You actually need a range, not just begin iterator. Note, you can't compare iterators from different containers, so you better off selecting the range, not the iterator. You can use Boost.Range to achieve it:
#include <boost/range.hpp>
#include <boost/foreach.hpp>
boost::iterator_range< container::iterator > r;
switch( e )
{
case Container1:
r = boost::make_iterator_range( vecContainer1 );
break;
case Container2:
r = boost::make_iterator_range( vecContainer2 );
break;
...
}
BOOST_FOREACH( container::value_type value, r )
{
...
}
As the loop tests for end, you should construct it to value what itEnd
values.