Как сделать мой класс повторяемым с помощью BOOST_FOREACH в C++?

РЕДАКТИРОВАТЬ: Я сдаюсь! Я использую просто for (string& word : sentence) { .. } вместо сейчас. BOOST_FOREACH безнадежно Спасибо.

Я прочитал это, и это, и они не помогли вообще. Особенно хочу спросить про вторую ссылку. Почему вы должны определить некоторые странные структуры под пространством имен boost? Класс, для которого я хочу включить BOOST_FOREACH, определен в моем собственном пространстве имен. Как я могу получить доступ к данным из этого класса, если я определю свои итераторы в namespace boost { .. }? Это не имеет никакого смысла. Я не знаю, почему найти эквивалентность IEnumerable на С ++ у меня ушло так много времени! Wans't boost должен сэкономить мое время?

Кто-нибудь может просто сказать мне самый лучший способ перебрать этот класс:

class Sentence {
private:
    vector<string> words;
}

с этим кодом:

Sentence sentence;
BOOST_FOREACH(string word, sentence) {
    // ..
}

Благодарю.

1 ответ

Согласно документации, все, что выглядит как контейнер стандартной библиотеки, будет работать. Простейшим способом было бы выставить пару итераторов в вашем классе. Если вы не хотите реализовывать свои собственные, просто используйте vector<string> итераторы:

class Sentence 
{
public:
  typedef vector<string>::iterator iterator;
  typedef vector<string>::const_iterator const_iterator;
  const_iterator begin() const { return words.begin(); }
  const_iterator end() const { return words.end(); }
private:
    vector<string> words;
};

Редактировать кажется BOOST_FOREACH не достаточно умен, чтобы понимать стандартные типы библиотечных контейнеров, но он может понимать пару стандартных итераторов библиотеки. Поэтому требуется дополнительный шаг:

#include <iostream>
#include <utility>
int main()
{
  Sentence sentence;
  auto s = std::make_pair(sentence.begin(), sentence.end());
  BOOST_FOREACH(std::string word, s) {
    std::cout << word << std::endl;
  }
}

Примечание 1: Вы можете захотеть удалить явный тип итератора, используя стирание типа, но это можно рассматривать как уточнение. См. Это соответствующее обсуждение для получения дополнительной информации.

Примечание 2: я никогда не был большим поклонником BOOST_FOREACH, Циклы, основанные на диапазоне C++11, снижают вероятность того, что я буду использовать его в реальном коде.

Другие вопросы по тегам