Mic*_*zia 7 c++ boost stl type-erasure
如何从输出迭代器中删除类型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;
}
Run Code Online (Sandbox Code Playgroud)
any_iterator不是设计用于输出迭代器,这back_insert_iterator是(或者,就此而言,输入迭代器).
back_insert_iterator被定义为从继承iterator<output_iterator_tag, void, void, void, void>即,它的value_type,reference_type,distance_type和pointer_type都是void,但any_iterator希望能够间接通过其背衬迭代非空值.也许它会更好地命名any_value_iterator; 但后来它是一个detail类模板.
所以我使用 Boost 实现了自己的一个。
#include <boost/function_output_iterator.hpp>
#include <boost/function.hpp>
template < class T >
class AnyInserter : public boost::function_output_iterator< boost::function< void ( const T & value ) > >
{
private:
typedef typename boost::function_output_iterator< boost::function< void ( const T & value ) > > BaseType;
template < class OutIt > struct Insert
{
Insert( OutIt it ) : m_it(it) {}
void operator () ( const T & value ) { m_it++ = value; }
OutIt m_it;
};
public:
template < class OutIt >
explicit AnyInserter( const OutIt & it ) : BaseType( Insert< OutIt >(it) ) {}
};
template < class OutIt >
inline AnyInserter< typename OutIt::container_type::value_type >
makeAnyInserter( const OutIt & it )
{
return AnyInserter< typename OutIt::container_type::value_type >(it);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |