Я не смог найти документ о внутренностях list_of
.Ниже очень упрощенная версия list_of
.Возможно, детали реализации будут отличаться в разных версиях, но я полагаю, что базовый процесс примерно такой, как следующий.Суть вопроса в том, что преобразование в другие коллекции реализовано с помощью шаблонной функции преобразования.
EDIT : Контейнеры-адаптеры IIRC, такие как std::stack/queue
, не могут быть созданы / назначены из диапазона.Таким образом, to_adapter
возвращает adapter_converter
вместо непосредственного создания контейнера назначения.Функция шаблонного преобразования в 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 ≷
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();
}
Надеюсь, это поможет