In C++ 98, Uso tipicamente quanto segue per dichiarare una variabile nel tipo di valore di un iteratore:Come dichiarare il valore di un iteratore attraverso decltype
typename std::iterator_traits<Iterator>::value_type value;
In C++ 11 abbiamo decltype e avevo pensato che il modo più semplice per dedurre il tipo di valore è:
decltype(*iterator) value;
Purtroppo per la maggior parte iteratori, il tipo di * iteratore è value_type & e non value_type. Qualche idea, senza le classi di modifica del tipo, come massaggiare quanto sopra nel produrre il value_type (e non alcun riferimento)?
Non credo che la domanda sia irragionevole dato che quanto segue è abbastanza robusto ma finisce per creare un'altra variabile.
auto x = *iterator;
decltype(x) value;
Si noti inoltre che voglio davvero il tipo dedotta e non solo un esempio esempio se volessi dichiarare un vettore std :: di questi valori.
Il tipo dell'espressione '* iterator' è' std :: :: iterator_traits reference', non 'value_type'. Questo non è necessariamente 'value_type &', e 'decltype' può riportare il tipo di un'espressione in modo diverso rispetto a quanto effettivamente dipende dalla sua categoria di valore. –
Se * solo * vuoi combinare le due righe della tua modifica, l'equivalente sarebbe 'typename std :: decay :: tipo valore;', ma controlla la risposta qui sotto e fai semplicemente 'don' lo faccio :) Sto solo aggiungendo questo come ['std :: decay'] (http://en.cppreference.com/w/cpp/types/decay) non è stato menzionato in questo Q/A prima. –