Как сделать мой класс повторяемым с помощью 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, снижают вероятность того, что я буду использовать его в реальном коде.