boost的`list_of`如何转换为其他集合?

时间:2011-04-28 17:36:00

标签: c++ boost

是否有文档描述了boost list_of internally如何转换为其他集合?

具体而言,adapter_converterconverter填充隐式转化过程的角色。

1 个答案:

答案 0 :(得分:1)

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

修改: 无法构造/分配像std::stack/queue这样的IIRC适配器容器 从一个范围。 因此,to_adapter会返回adapter_converter而不是构建。{1}} 目标容器直接。 adapter_converter中的模板化转换函数构造了 带push的适配器容器 至于班级converter,根据我的理解,这是一种混合。 它用于隐藏细节并在某种程度上提供抽象。 但是,我认为这与问题的重点无关 (直接转换为多个馆藏。)

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();
}

希望这有帮助