2012-02-26 34 views
11

Tôi có một std :: unordered_mapLàm thế nào để chọn loại trình vòng lặp sử dụng biến tự động?

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

Tôi muốn có được một iterator const sử dụng find. Trong C++ 03 tôi sẽ làm

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

trong C++ 11 Tôi muốn sử dụng tự động thay vì cắt giảm các mẫu

auto = myMap.find("SomeValue"); 

Đây sẽ là một const_iterator hoặc lặp? Làm thế nào để trình biên dịch quyết định sử dụng? Có cách nào tôi có thể buộc nó để chọn const?

+1

Có lẽ trình biên dịch được thực hiện chức năng toàn suy luận kiểu ... Nhưng tại sao các constness của các vấn đề lặp đối với bạn? –

+4

Trừ khi sự hiểu biết của tôi về quá tải là sai (hoặc http://en.cppreference.com/w/cpp/container/unordered_map/find là sai), 'nonConstMap.find' luôn trả về một' iterator'. Loại trả lại và những gì bạn làm với kết quả (ví dụ: chuyển nó tới một hàm tạo 'const_iterator') không ảnh hưởng đến việc chọn quá tải nào. Nghĩa là, nó chỉ trả về 'const_iterator' nếu bạn gọi' constMap.find'. – delnan

Trả lời

7

Nó sẽ sử dụng trình lặp không phải là const nếu myMap là biểu thức không phải const. Do đó bạn có thể nói

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

Và sau đó

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

Tại sao không chỉ 'mẫu const T & const_ (T & t) {return t; } '? – MSalters

+0

Điều đó sẽ không hoạt động với các giá trị phi giá trị và sẽ biến đổi giá trị const thành giá trị. không tốt. –

+0

Tôi đã không xem xét sau này (tại sao làm một cái gì đó 'const' mà đã là' const'?), Nhưng bạn sẽ trivially giải quyết rằng với một quá tải anyway. Các trường hợp rvalue là tốt, nhưng tôi vẫn đang cố gắng để quấn đầu của tôi xung quanh 'apply_vc'. Tôi thấy _what_ nó, nhưng không phải lý do tại sao nó là cần thiết. – MSalters

Các vấn đề liên quan