编辑:我放弃了!我现在只使用for (string& word : sentence) { .. }
代替。 BOOST_FOREACH
毫无希望。谢谢。
我看过this和this,但他们根本没有帮助。特别是我想询问第二个链接。为什么必须在命名空间boost
下定义一些奇怪的结构?我想要启用BOOST_FOREACH的类是在我自己的命名空间中定义的。如果我在namespace boost { .. }
中定义迭代器,如何从该类访问数据?这毫无意义。我不知道为什么在C ++中找到IEnumerable
的等价性花了我这么多时间!不能boost
应该节省我的时间吗?
有人可以告诉我迭代这个类的最好方法:
class Sentence {
private:
vector<string> words;
}
使用此代码:
Sentence sentence;
BOOST_FOREACH(string word, sentence) {
// ..
}
感谢。
答案 0 :(得分:3)
根据the documentation,看起来像标准库容器的任何东西都可以工作。最简单的方法是在类中公开一对迭代器。如果您不想实现自己的,只需使用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:您可能希望使用类型擦除来解析迭代器的显式类型,但这可以看作是一种细化。有关详细信息,请参阅this relevant discussion。
注2:我从未成为BOOST_FOREACH
的忠实粉丝。基于C ++ 11范围的循环使我在实际代码中使用它的可能性更小。