El STL define comúnmente un iterador de salida de este modo:de iterador de salida
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
¿Por qué definir iteradores salida value_type
como void
? Sería útil para un algoritmo saber qué tipo de valor se supone que debe generar.
Por ejemplo, una función que traduce una consulta de URL "key1=value1&key2=value2&key3=value3"
en cualquier contenedor que contiene elementos de cadenas de valor-clave.
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);
}
Los consejos SGI reference page of value_type
esto se debe a que no es posible eliminar la referencia de un iterador de salida. Pero ese no es el único uso de value_type
: podría querer crear una instancia para asignarlo al iterador.
¿Qué enfoque alternativo existe para construir un valor a la salida con el iterador de salida? Dos enfoques que consideran:
- aceptar un parámetro funtor que devolvería un objeto del tipo correcto. Todavía quiero tener una versión del algoritmo que no tome ese parámetro de objeto de función.
- Requerir que el contenedor de salida tenga
pair<string,string>
, o bien un tipo convertible de ese. Me pregunto si puedo prescindir de este requisito, quizás permitir cualquier elemento que pueda construir a partir de dosstd::string
s.
Lo que trato de hacer es generalizar el algoritmo de manera que funcione con contenedores de cualquier tipo que puedan construir a partir de dos 'cadenas ', no solo' map '. Entonces, la plantilla puede crear instancias en '* result = pair (key, value)' así como en '* result = unicorn_pony (key, value)'. –
wilhelmtell
Si puedo agregar una referencia: un documento [pdf] sobre los iteradores de salida, también se queja de este problema. http://semantics.org/publications/02_02_multiout.pdf – wilhelmtell
El ejemplo dado en ese documento es exactamente por qué los iteradores de salida no son necesarios para definir un tipo de valor. Decidió arbitrariamente que 'MultiOut :: value_type' debería ser' double', pero en realidad * cualquier tipo * que se pueda convertir implícitamente a 'double' y' int' son valores razonables para usar para el operador de asignación. –