如何在C ++中通过BOOST_FOREACH使我的类可迭代?

时间:2013-12-26 05:03:58

标签: c++ boost iterator boost-foreach

编辑:我放弃了!我现在只使用for (string& word : sentence) { .. }代替。 BOOST_FOREACH毫无希望。谢谢。

我看过thisthis,但他们根本没有帮助。特别是我想询问第二个链接。为什么必须在命名空间boost下定义一些奇怪的结构?我想要启用BOOST_FOREACH的类是在我自己的命名空间中定义的。如果我在namespace boost { .. }中定义迭代器,如何从该类访问数据?这毫无意义。我不知道为什么在C ++中找到IEnumerable的等价性花了我这么多时间!不能boost应该节省我的时间吗?

有人可以告诉我迭代这个类的最好方法:

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

使用此代码:

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

感谢。

1 个答案:

答案 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范围的循环使我在实际代码中使用它的可能性更小。