Home > Back-end >  C : emplace to std::unordered_map value containing std::mutex
C : emplace to std::unordered_map value containing std::mutex

Time:12-21

Could you, please, help me to figure out the right syntax of how to emplace into an std::unordered_map a value containing an std::mutex?

Here is an example:

#include <mutex>
#include <unordered_map>

using SubMap = std::unordered_map<int, float>;
struct MutexedSubMap{ std::mutex mutex; SubMap subMap; };
std::unordered_map<int, MutexedSubMap> m;

// The following do not work:
// m.emplace(7, MutexedSubMap{});
// m.emplace(7);
// m.emplace(7, {});

CodePudding user response:

emplace forwards the arguments to a constructor. You can write a constructor for MutexedSubMap:

#include <mutex>
#include <unordered_map>

using SubMap = std::unordered_map<int, float>;
struct MutexedSubMap{ SubMap subMap; std::mutex mutex; MutexedSubMap(const SubMap& sm): subMap(sm){} };
std::unordered_map<int, MutexedSubMap> m;

int main() {
    m.emplace(7, SubMap{});
}

Note that m[7]; would have the same effect.

  • Related