【发布时间】:2012-05-29 06:43:35
【问题描述】:
如何从输出迭代器中擦除类型为std::insert_iterator 和std::back_insert_iterator?是否可以使用 boost any_iterator 这样做?
#include <boost/range.hpp>
#include <boost/range/detail/any_iterator.hpp>
#include <vector>
typedef boost::range_detail::any_iterator<
int, boost::incrementable_traversal_tag, int &, std::ptrdiff_t > It;
int main()
{
std::vector<int> v;
It outIt( v.begin() ); // compiles
It inserter( std::back_inserter(v) ); // does not compile
return 0;
}
【问题讨论】:
-
“擦除类型”是什么意思?
-
@EitanT:您应该查找“C++ 类型擦除”,但要简短定义“将具有通用接口的多种类型转换为具有相同接口的一种类型的过程”。 Boost::Any 就是典型的例子。
-
@JesseGood Aaa 我知道那是什么,我从来不知道它被称为“类型擦除”。哇!
-
@EitanT:这是一篇关于type erasure 的好文章,这是pattern。
-
我无法获得任何涉及
boost::any_range的代码来使用 GCC 4.6 或 4.7 进行编译。不仅标头<boost/range/any_range.hpp>有其自身的问题(例如,它不能独立工作,您需要在其之前包含<boost/range/concepts.hpp>),但不知何故,在 4.7 中,当std::iterator_traits为iterator类型实例化时会出现问题any_range实例化。如果我回避 that 那么any_range的实现仍然存在问题,这可能与两阶段查找有关,也可能无关。抱歉,找不到更多信息。
标签: c++ boost stl type-erasure