2014-01-28 2 views
4

Я пишу обертку вокруг std :: unorered_map, но я немного не знаю, как я должен предоставить публичную функцию-член для доступа к итерации, предоставляемой функцией «:» в C++ 11, например:Предоставление оператора «:» для UDF std :: unordered_map?

//Iterate through all unoredered_map keys 
for(auto x : my_map){ 
    //Process each x 
} 

Как я могу предоставить такую ​​же возможность, как и выше, через мою обертку вокруг unordered_map?

Пробовал решение:

#include <unordered_map> 
#include <mutex> 

template<typename T, typename K> 
class MyClass{ 
private: 
    std::unordered_map<T,K> map; 
    std::mutex mtx; 

public: 

    MyClass(){} 

    MyClass<T,K>(const MyClass<T,K>& src){ 
     //Going to lock the mutex 
    } 

    void insert(T key, K value){ 
     mtx.lock(); 
     map[T] = K; 
     mtx.unlock(); 
    } 

    K operator[](T key) const 
    { 
     return map[key]; 
    } 

    K get(T key){ 
     return map[T]; 
    } 

    decltype(map.cbegin()) begin() const 
    { 
     return map.begin(); 
    } 

    decltype(map.cend()) end() const { 
     return map.end(); 
    } 

    bool count(T key){ 
     int result = false; 
     mtx.lock(); 
     result = map.count(key); 
     mtx.unlock(); 
     return result; 
    } 

}; 
+0

Использование lockguard вместо ручного '' lock' и unlock' – balki

ответ

14

Просто обеспечить begin() и end() методы, возвращая подходящие итераторы.

Вот рабочий пример:

#include <unordered_map> 
#include <iostream> 
#include <string> 
struct Foo 
{ 
    std::unordered_map<std::string, int> m; 
    auto begin() const ->decltype(m.cbegin()) { return m.begin(); } 
    auto end() const ->decltype(m.cend()) { return m.end(); } 

}; 


int main() 
{ 
    Foo f{ { {"a", 1}, {"b", 2}, {"c",3} } }; 

    for (const auto& p : f) 
    std::cout << p.first << " " << p.second << std::endl; 

    std::cout << std::endl; 
} 
+2

[подробнее] (http://en.cppreference.com/w/cpp/language/range -for), как определяется 'range-based for'. – Erbureth

+0

Разве это не работает, если я помещаю член данных unordered_map в класс шаблона? Я получаю эту ошибку: «Ошибка C2228: слева от« .cend »должен быть класс/struct/union» – user997112

+0

Вам нужно будет опубликовать * минимальный * пример, который воспроизводит ошибку. – juanchopanza

Смежные вопросы