boost的"list_of"如何转换为其他系列?

How does boost's `list_of` converts to other collections?

本文关键字:转换 其他系列 何转换 list of boost      更新时间:2023-10-16

是否有文档描述boost的list_of如何在内部转换为其他集合?

具体来说,adapter_converterconverter在隐式转换过程中扮演什么角色?

我找不到关于list_of内部的文档。下面是list_of的简化版本。可能实现细节之间会有不同的区别版本,但我想基本过程大致如下。问题的关键是,转换到其他集合是使用模板化转换函数实现。

编辑:像std::stack/queue这样的IIRC适配器容器不能被构造/分配从一个范围。因此,to_adapter返回一个adapter_converter,而不是构造直接使用目的容器。模板化转换函数在adapter_converter中构造push .
对于converter班,在我的理解中,它是一种mix-in。它用于隐藏细节,并在某种程度上提供抽象。然而,我认为这与问题的要点没有多大关系(转换为多个集合)直接

template< class T >
struct generic_list {
  typedef std::deque< T > converter;
  converter values_;
  generic_list& operator()( T const& u ) {
    values_.push_back( u );
    return *this;
  }
  template< class Container >
  operator Container() const { // conversion function
    return Container( values_.begin(), values_.end() );
  }
  struct adapter_converter {
    converter const &gl;
    adapter_converter( converter const& gl ) : gl( gl ) {}
    template< class Adapter >
    operator Adapter() const { // conversion function for adapter
      Adapter a;
      converter::const_iterator i = gl.begin(), e = gl.end();
      for ( ;  i != e;  ++ i ) a.push( *i );
      return a;
    }
  };
  adapter_converter to_adapter() const {
    return adapter_converter( values_ );
  }
};
template< class T >
generic_list<T> list_of( T const& t ) {
  return generic_list<T>()( t );
}
int main() {
  std::stack< int > s = list_of(1)(2).to_adapter();
  std::queue< int > q = list_of(3)(4).to_adapter();
}

希望能有所帮助