2017-02-22 8 views
0

необходимо создать unordered_map для integer и некоторого определенного класса - MyClass, где MyClass использует мьютекс для синхронизации доступа к данным, т. Е. Объект MyClass нельзя скопировать или перенести. Возможно ли создать такую ​​карту? Как использовать emplace для создания объекта MyClass, чтобы избежать копирования/перемещения?unordered_map emplace - как создавать объекты на месте

template<typename T> 
class MyClass { 
    public: 
    T pop() { 
     std::unique_lock<std::mutex> lock(m_mutex); 
     m_cv.wait(lock, [this]{return !m_queue.empty();}); 
     return m_queue.pop(); 
    } 
    void push(T const& x) { 
     { 
     std::unique_lock<std::mutex> lock(m_mutex); 
     m_queue.push(x) ; 
     } 
     m_cv.notify_one(); 
    } 
    private: 
    std::queue<T> m_queue ; 
    std::mutex m_mutex ; 
    std::condition_variable m_cv; 
}; 

int main(){ 
    std::unordered_map<int, MyClass<float>> mmap; 
    mmap.emplace(1, MyClass<float>{}); 
} 
+0

в любом случае этот код не будет компилироваться, как 'станд :: очереди :: pop' возвращает void, а не 'T'. если 'T'' 'void', то' std :: queue 'является незаконным –

ответ

2

Понадобится:

mmap.emplace(std::piecewise_construct, 
      std::forward_as_tuple(1), // args for key 
      std::forward_as_tuple()); // args for mapped value 

(При этом используется конструктор кусочно-парный для типа значения.)

+0

[Demo] (http://ideone.com/0BdyOI). –