【发布时间】:2017-06-09 15:43:57
【问题描述】:
我有以下用于锁定对象的类:
#include <memory>
template <class Type, class Mutex>
class LockableObject {
public:
class UnlockedObject {
public:
UnlockedObject(Mutex &mutex, Type &object)
: mutex_(mutex), object_(object) {}
UnlockedObject(UnlockedObject &&other) = default;
// No copying allowed
UnlockedObject(const UnlockedObject &) = delete;
UnlockedObject &operator=(const UnlockedObject &) = delete;
~UnlockedObject() { mutex_.unlock(); }
Type *operator->() { return &object_; } // Version 1
// Type &operator->() { return object_; } // Version 2
private:
Mutex &mutex_;
Type &object_;
};
template <typename... Args>
LockableObject(Args &&... args) : object_(std::forward<Args>(args)...) {}
UnlockedObject Lock() {
mutex_.lock();
return UnlockedObject(mutex_, object_);
}
private:
Mutex mutex_;
Type object_;
};
我想按如下方式使用它来锁定和解锁对共享对象的访问。第二个示例利用了-> 运算符多次应用自身的能力:
// Example 1
{
LockableObject<std::string, std::mutex> locked_string;
auto unlocked_string = locked_string.Lock();
// This is what I want:
unlocked_string->size(); // works for version 1, breaks for version 2
}
// Example 2
{
LockableObject<std::unique_ptr<std::string>, std::mutex> locked_string(std::unique_ptr<std::string>(new std::string()));
auto unlocked_string = locked_string.Lock();
// This is what I want:
unlocked_string->size(); // works for version 2, breaks for Version 1
// Workaround
unlocked_string->get()->size(); // works for version 1, but is not nice
}
能否以某种方式更改类以使两个示例都使用unlocked_string->size() 而不是使用->get() 的解决方法?可能通过使用模板专业化或类似的东西?
【问题讨论】:
-
考虑
LockablePtr类型? -
重载
operator()以获得类似unlocked_string()->size()的内容。问题真的是你的get()来自std::unique_ptr。如果您想摆脱get(),则必须专门为unique_pointer设计模板 -
@subzero 专门用于
unique_ptr,或者甚至更好,具有用于Types 的版本2 与重载operator->和用于其他Types 的版本1 会很好...有关如何执行此操作的更多详细信息?
标签: c++ c++11 templates operator-overloading