我正在尝试迭代一个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;
}distance cout语句给出的长度是有限的(2),但是循环似乎是无限运行的。
任何建议都非常感谢!
发布于 2012-10-27 05:20:01
你不能像那样简单地迭代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() );发布于 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
发布于 2012-10-27 05:20:39
next实际上并不推进迭代器,它只是返回下一个迭代器。
这可以在文档中看到,因为函数next接受一个常量参数,这意味着它不可能实际修改迭代器:
template<
typename I
>
typename result_of::next<I>::type next(I const& i);
^^^^^https://stackoverflow.com/questions/13094535
复制相似问题