STL обычно определяет выходной итератор так:
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
Почему выходные итераторы определяют value_type
как void
?. Было бы полезно, чтобы алгоритм знал, какой тип значения он должен выводить.
Например, функция, которая преобразует URL-запрос "key1=value1&key2=value2&key3=value3"
в любой контейнер, содержащий элементы строки значения ключа.
template<typename Ch,typename Tr,typename Out>
void parse(const std::basic_string<Ch,Tr>& str, Out result)
{
std::basic_string<Ch,Tr> key, value;
// loop over str, parse into p ...
*result = typename iterator_traits<Out>::value_type(key, value);
}
справочная страница SGI value_type
подсказывает это потому, что невозможно разыменовать выходной итератор. Но это не единственное использование value_type
: я мог бы создать экземпляр для того, чтобы назначить его итератору.
Какой альтернативный подход для построения значения для вывода с выходным итератором? Два подхода, которые я рассматривал:
- Примите параметр functor, который вернет объект правильного типа. Я все еще хочу иметь версию алгоритма, который не принимает этот параметр объекта функции.
- Требовать, чтобы выходной контейнер содержал
pair<string,string>
, или же тип, конвертируемый из этого. Интересно, могу ли я обойтись без этого требования, возможно, разрешить любой элемент, который может быть построен из двухstd::string
s.