迭代Boost fusion :: vector

时间:2012-10-26 21:15:27

标签: c++ boost iterator boost-fusion

我正在尝试使用:

迭代boost :: fusion向量
typedef typename fusion::result_of::begin<T>::type t_iter;
  std::cout << distance(begin(t), end(t)) << std::endl;
  for(t_iter it = begin(t); it != end(t); next(it)){
    std::cout<<deref(it)<<std::endl;
  }

距离cout语句给出了一个有限长度(2),但循环似乎无限期地运行。

任何建议都非常感谢!

4 个答案:

答案 0 :(得分:4)

你不能像这样迭代一个 Fusion 向量,每个迭代器的类型可能与前一个迭代器不同(通常是)。我想这就是你的代码中没有it = next(it)的原因,它会产生编译错误。

您可以使用boost::fusion::for_each以及将每个元素打印到标准输出的函数对象:

struct print
{
    template< typename T >
    void operator()( T& v ) const
    {
        std::cout << v;
    }
};

...

boost::fusion::for_each( t, print() );

答案 1 :(得分:2)

fusion是一个很棒的库,现在你应该以多种方式将它与你每天使用的C ++程序完全不同,它将编译时元编程的强大功能与运行时相结合,为此你现在应该没有可以处理fusion容器中所有项目的类型。这意味着什么?这意味着result_of::begin<T>::type并不总是与next(it)匹配,因此您无法在fusion中使用for迭代器。

您的代码中明显的问题是您忽略了next的返回值,它会导致您的代码永久运行,但您无法在it = next(it)中使用它,因为它们的类型可能会有所不同! !

那你该怎么办?您应该为此目的使用boost::fusion::for_each

答案 2 :(得分:1)

next实际上没有推进迭代器,它只返回下一个迭代器。

这可以在文档中看到,因为函数next采用常量参数,这意味着它不可能实际修改迭代器:

template<
    typename I
    >
typename result_of::next<I>::type next(I const& i);
                                         ^^^^^

答案 3 :(得分:0)

问题是在循环内部你是dereferencing你的迭代器。当你对它应用next时,它意味着什么,这就是你的循环永远运行的原因。