2012-02-26 6 views
11

que tienen un std :: unordered_map¿Cómo seleccionar el tipo de iterador usando la variable automática?

std::unordered_map<std::string, std::string> myMap; 

Quiero conseguir un iterador const utilizando hallazgo. En C++ 03 Haría

std::unordered_map<std::string, std::string>::const_iterator = myMap.find("SomeValue"); 

en C++ 11 que me gustaría utilizar automóviles en lugar de reducir las plantillas

auto = myMap.find("SomeValue"); 

Será este un const_iterator o iterador? ¿Cómo decide el compilador cuál usar? ¿Hay alguna manera de obligarlo a elegir const?

+1

Tal vez el compilador está haciendo en toda la función de la inferencia de tipos ... Pero ¿por qué el constness de los asuntos iterador para usted? –

+4

A menos que mi comprensión de la sobrecarga sea incorrecta (o http://en.cppreference.com/w/cpp/container/unordered_map/find es incorrecta), 'nonConstMap.find' siempre devuelve un' iterator'. El tipo de devolución y lo que haces con el resultado (por ejemplo, pasarlo a un constructor 'const_iterator') no afecta qué sobrecarga se elige. Es decir, solo devuelve un 'const_iterator' si llama a' constMap.find'. – delnan

Respuesta

7

Utilizará iteradores no const si myMap es una expresión no const. Por lo tanto, se podría decir

#include <type_traits> 
#include <utility> 

template<typename T, typename Vc> struct apply_vc; 
template<typename T, typename U> struct apply_vc<T, U&> { 
    typedef T &type; 
}; 
template<typename T, typename U> struct apply_vc<T, U&&> { 
    typedef T &&type; 
}; 

template<typename T> 
typename apply_vc<typename std::remove_reference<T>::type const, T&&>::type 
const_(T &&t) { 
    return std::forward<T>(t); 
} 

Y luego

auto it = const_(myMap).find("SomeValue"); 
+0

¿Por qué no simplemente 'plantilla const T & const_ (T & t) {return t; } '? – MSalters

+0

Eso no funcionará con los valores r noconst y transformará los valores de const a lvalues. no está bien. –

+0

No había considerado esto último (¿por qué hacer algo 'const' que ya es' const'?), Pero de todos modos lo resolverías trivialmente con una sobrecarga. El caso rvalue es bueno, pero aún estoy tratando de entender 'apply_vc'. Veo _qué_sea, pero no por qué es necesario. – MSalters

Cuestiones relacionadas