2017-02-22 52 views
0

需要爲整數和一些用戶定義的類創建unordered_map - MyClass的,其中使用MyClass的互斥用於數據訪問的同步,即MyClass的對象不能被複制或移動。 是否可以創建這樣的地圖? 如何使用emplace創建MyClass的對象以避免複製/移動?unordered_map佈設 - 如何代替創建對象

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

反正這代碼不能編譯,因爲'的std ::隊列:: pop'返回void,而不是'T'。如果'T'是'void',比'的std ::隊列'是非法 –

回答

2

您需要:

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

(這裏使用該值類型分段對構造函數)。

+0

[演示](http://ideone.com/0BdyOI)。 –