Я программирую библиотеку, где мне нужно создать интерфейс итератора, и я хочу сделать его как можно более общим.
template<class OutputIterator>
void receive(OutputIterator oit){
auto val = get_function< std::iterator_traits<OutputIterator>::value_type > (); // legacy function
oit = val;
}
К моему удивлению, большинство выходных итераторов value_type
является void
, (void
делает код недействительным, потому что void
переменная не может быть объявлена).
Вот два примера:
http://en.cppreference.com/w/cpp/iterator/back_insert_iterator
http://en.cppreference.com/w/cpp/iterator/ostream_iterator
Однако в обоих случаях есть очевидный связанный тип значения, я мог бы взломать каждый и «увидеть», что существует тип значения. Например back_insert_iterator::container_type::value_type
(но не доступно из iterator_traits
).
Почему стандарт пытается скрыть value_type
выходных итераторов?
Возможно правильных условий нет value_type
но есть, очевидно, некоторый тип, связанный. Это упущение? Я неправильно использую выходной итератор?
Задача ещё не решена.
Других решений пока нет …