首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代Boost fusion::vector

迭代Boost fusion::vector
EN

Stack Overflow用户
提问于 2012-10-27 05:15:27
回答 4查看 2.3K关注 0票数 1

我正在尝试迭代一个boost::fusion向量,使用:

代码语言:javascript
复制
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;
  }

distance cout语句给出的长度是有限的(2),但是循环似乎是无限运行的。

任何建议都非常感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-27 05:20:01

你不能像那样简单地迭代Fusion向量,每个迭代器的类型可能与前一个不同(通常是不同的)。我猜这就是为什么你的代码中没有it = next(it)的原因,它会给出一个编译错误。

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

代码语言:javascript
复制
struct print
{
    template< typename T >
    void operator()( T& v ) const
    {
        std::cout << v;
    }
};

...

boost::fusion::for_each( t, print() );
票数 4
EN

Stack Overflow用户

发布于 2012-10-27 05:25:33

fusion是一个很棒的库,你现在应该知道它在许多方面与你在日常C++程序中使用的不同,它将编译时元编程的能力与运行时结合在一起,因为现在你应该知道没有一个类型可以处理fusion容器中的所有项。这意味着什么?这意味着result_of::begin<T>::type并不总是与next(it)匹配,因此您不能在这样的for中使用fusion迭代器。

代码中最明显的问题是忽略了next的返回值,这将导致代码永远运行,但不能在it = next(it)中使用它,因为它们的类型可能不同!!

那么你应该怎么做呢?为此,您应该使用boost::fusion::for_each

票数 2
EN

Stack Overflow用户

发布于 2012-10-27 05:20:39

next实际上并不推进迭代器,它只是返回下一个迭代器。

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

代码语言:javascript
复制
template<
    typename I
    >
typename result_of::next<I>::type next(I const& i);
                                         ^^^^^
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13094535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档