I have the following code. The LockWrap
is what I want to add into a std::map
.
The LockWrap
inherits a noncopyable
which is exactly from the boost library. And I can't modify the definition of LockWrap
.
#include <mutex>
#include <map>
struct base_token {};
class noncopyable: base_token
{
protected:
constexpr noncopyable() = default;
~noncopyable() = default;
noncopyable( const noncopyable& ) = delete;
noncopyable& operator=( const noncopyable& ) = delete;
};
class LockWrap : private noncopyable
{
public:
explicit LockWrap(std::mutex & mut)
: lock_(mut)
{}
std::lock_guard<std::mutex> lock_;
};
LockWrap genLockWrap(std::mutex & mut) {
return LockWrap(mut);
}
int main() {
std::mutex mut;
typedef std::map<int, LockWrap> map_type;
map_type locks_held;
int id = 1;
// None of the following can help.
// locks_held.emplace(std::move(1), genLockWrap(mut));
// locks_held.insert(map_type::value_type{std::move(1), genLockWrap(mut)});
// locks_held.insert(std::move(map_type::value_type{std::move(1), genLockWrap(mut)}));
}
What I want is to add LockWrap objects into locks_held
. However, non of my attempt works. The std::map<>::insert using non-copyable objects and uniform initialization 's way not works either. I think it is because I don't have a move constructor.
I know I can create a uniformed lock on multiple mutex to work around my problem. However, I still want to know how to solve this problem.