Нет необходимости в этой хакерской атаке.Boost.Foreach использует Boost.Range для получения итераторов.Существует два способа его расширения:
- Предоставление функций-членов и вложенного типа: http://www.boost.org/doc/libs/1_48_0/libs/range/doc/html/range/reference/extending/method_1.html
- Предоставление автономных функций и специализированных метафункций: http://www.boost.org/doc/libs/1_48_0/libs/range/doc/html/range/reference/extending/method_2.html
Теперь в вашем случае похоже, что вы предоставляете функции-члены begin()
и end()
, но не предоставляете вложенный тип iterator
(я полагаю, это то, что вы подразумеваете под изменяемым API итерации).Вы можете сделать одну из двух вещей.
Во-первых, вы можете typedef
тип вложенного итератора следующим образом:
typedef const_iterator iterator;
Во-вторых, если вы не можете изменить класс, вы можете специализировать метафункции, например так (заменяяYourContainer с любым типом вашего контейнера):
namespace boost
{
//
// Specialize metafunctions. We must include the range.hpp header.
// We must open the 'boost' namespace.
//
template< >
struct range_mutable_iterator< YourContainer >
{
typedef YourContainer::const_iterator type;
};
template< >
struct range_const_iterator< YourContainer >
{
typedef YourContainer::const_iterator type;
};
} // namespace 'boost'
Конечно, я предполагаю, что у вас есть const_iterator
typedef
в вашем классе (так как вы сказали, что он не поддерживает изменяемость).Если вы этого не сделаете, вам нужно будет заменить YourContainer::const_iterator
на любой тип, которым является const_iterator
.