Lo STL definisce comunemente un iteratore di uscita in questo modo:di iteratore di uscita
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
Perché iteratori di output definire value_type
come void
? Sarebbe utile per un algoritmo sapere quale tipo di valore dovrebbe produrre.
Ad esempio, una funzione che converte una query URL "key1=value1&key2=value2&key3=value3"
in qualsiasi contenitore che contiene elementi di stringhe valore-chiave.
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);
}
I SGI reference page of value_type
indizi per questo è perché non è possibile dereference un iteratore uscita. Ma questo non è l'unico uso di value_type
: potrei voler istanziarne uno per assegnarlo all'iteratore.
Quale approccio alternativo esiste per la costruzione di un valore da emettere con l'iteratore di output? Due approcci che considerano:
- accettare un parametro di funtore che restituire un oggetto del tipo corretto. Voglio comunque avere una versione dell'algoritmo che non accetta il parametro dell'oggetto function.
- Richiedere che il contenitore di output detenga
pair<string,string>
o un tipo convertibile da quello. Mi chiedo se posso fare a meno di questo requisito, forse consentire qualsiasi elemento che può costruire da duestd::string
s.
Quello che sto cercando di fare è generalizzare l'algoritmo in modo tale che funzioni con contenitori di qualsiasi tipo che possano costruire da due 'string's, non solo' map '. Quindi, il modello può creare un'istanza in '* risultato = coppia (chiave, valore)' così come '* risultato = unicorn_pony (chiave, valore)'. –
wilhelmtell
Se posso aggiungere un riferimento: un documento [pdf] sugli iteratori di output, si lamenta anche di questo problema. http://semantics.org/publications/02_02_multiout.pdf – wilhelmtell
L'esempio fornito in quel documento è esattamente il motivo per cui gli iteratori di output non sono richiesti per definire un tipo di valore. Ha arbitrariamente deciso che 'MultiOut :: value_type' dovrebbe essere' double', ma in realtà * qualsiasi * tipo che può essere convertito implicitamente in 'double' e' int' sono valori ragionevoli da utilizzare per l'operatore di assegnazione. –