2012-02-26 18 views
11

Mam std :: unordered_mapJak wybrać typ iteratora za pomocą automatycznej zmiennej?

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

chcę uzyskać const iterator użyciu find. W C++ 03 zrobiłbym

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

w C++ 11 chciałbym używać auto zamiast ściąć na szablonach

auto = myMap.find("SomeValue"); 

Będzie to const_iterator lub iterator? W jaki sposób kompilator decyduje, którego użyć? Czy istnieje sposób, w jaki mogę go zmusić do wyboru const?

+1

Może kompilator robi funkcji szerokości typu wnioskowanie ... Ale dlaczego constness od spraw iterator do ciebie? –

+4

Jeśli moje rozumienie przeciążenia nie jest poprawne (lub http://en.cppreference.com/w/cpp/container/unordered_map/find jest złe), 'nonConstMap.find' zawsze zwraca' iterator'. Typ zwracany i to, co robisz z wynikiem (np. Przekazujesz go do konstruktora 'const_iterator'), nie ma wpływu na to, które obciążenie zostało wybrane. Oznacza to, że zwraca tylko 'const_iterator', jeśli wywołasz' constMap.find'. – delnan

Odpowiedz

7

Będzie używać nie-stałych iteratorów, jeśli myMap jest wyrażeniem niezwiązanym. Dlatego można powiedzieć,

#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); 
} 

a następnie

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

Dlaczego nie tylko 'szablon const T & const_ (T & t) {return t; } '? – MSalters

+0

To nie zadziała z nie ronicznymi wartościami r i zamieni stałe wartości r na wartości l. niedobrze. –

+0

Nie brałem pod uwagę tego drugiego (dlaczego zrobić coś 'const', które jest już' const'?), Ale i tak byś rozwiązał to trywialnie mimo przeciążenia. Przypadek rvalue jest dobry, ale wciąż próbuję objąć głowę 'apply_vc'. Widzę, co robi, ale nie dlaczego jest to konieczne. – MSalters

Powiązane problemy