2017-02-22 13 views
0

整数と一部のユーザー定義クラスのMyClassを作成する必要があります。MyClassはデータアクセス同期にmutexを使用します。つまり、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

とにかく、このコードは 'のstd ::キュー:: pop'として、コンパイルされません'T'ではなくvoidを返します。 '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)。 –

関連する問題