Я использую этот шаблон домашнего варки, который добавляет тип итерации, который может обрабатываться BOOST_FOREACH
namspace homebrew
{
template
<
class Key,
class T,
class Compare = std::less<Key>,
class CloneAllocator = boost::heap_clone_allocator,
class Allocator = std::allocator< std::pair<const Key,void*> >
>
class ptr_map :
public boost::ptr_map<Key,T,Compare,CloneAllocator,Allocator>
{
public:
typedef boost::ptr_container_detail::ref_pair<Key,const T* const> const_ref;
typedef boost::ptr_container_detail::ref_pair<Key,T* const> ref;
};
}
Давайте предположим, что foo и bar - два ваших любимых типа;)
typedef homebrew::ptr_map<foo,bar> Map;
int f( const Map& m )
{
BOOST_FOREACH(Map::const_ref v, m)
{
v.first; // foo
v.second; // const bar* const
}
}
или
int f( Map& m )
{
BOOST_FOREACH(Map::ref v, m)
{
v.first; // foo
v.second; // bar* const
}
}
То, что вы должны использовать, похоже, зависит не от того, как вы используете его в цикле (константном или неконстантном), а от константности карты !! Таким образом, следующее приведет к ошибке ...
int f( Map& m )
{
BOOST_FOREACH(Map::const_ref v, m) // can't use const_ref because m isn't const
{
...
}
}
Weird! не так ли?
Самым большим для меня является то, что из всех предложенных здесь решений это первое, которое корректно обрабатывается окраской синтаксиса Eclipse CDT (при использовании атрибута окраски синтаксиса «Код / проблема»).