ThreadSafeVar
用于方便的变量粘合,我想别名
std::shared_ptr
和
std::make_shared
,所以我可以做,例如。
ThreadSafePtr<int> a = ThreadSafePtr_make<int>(2)
,但我不知道如何做出参数。
ThreadSafePtr_make
我如何别名#include <memory>
#include <mutex>
template<typename T>
class ThreadSafeVar
{
T value;
std::mutex mutex{};
public:
template<typename... Args>
ThreadSafeVar(Args&&... args) : value{ std::forward<Args>(args)... } {}
ThreadSafeVar(ThreadSafeVar&) = delete;
ThreadSafeVar(ThreadSafeVar&&) = delete;
ThreadSafeVar& operator=(ThreadSafeVar&) = delete;
ThreadSafeVar& operator=(ThreadSafeVar&&) = delete;
class Lock
{
friend class ThreadSafeVar<T>;
T& ref;
std::unique_lock<std::mutex> lock;
Lock(ThreadSafeVar* tsvar) : ref{ tsvar->value }, lock{ tsvar->mutex } {}
public:
T & get() const { return ref; }
};
Lock lock() { return Lock{ this }; }
};
template<typename T>
using ThreadSafePtr = std::shared_ptr<ThreadSafeVar<T>>;
template<typename T>
constexpr auto ThreadSafePtr_make = std::make_shared<ThreadSafeVar<T>>;
template <typename T, typename... Args>
constexpr ThreadSafePtr<T>(*ThreadSafePtr_make2)(Args&&...) = &std::make_shared<ThreadSafeVar<T>>;
int main()
{
ThreadSafePtr<int> a = std::make_shared<ThreadSafeVar<int>>(2);
a->lock().get()++;
ThreadSafePtr<int> b = ThreadSafePtr_make<int>();
ThreadSafePtr<int> c = ThreadSafePtr_make<int>(2); // fail, too many arguments
ThreadSafePtr<int> d = ThreadSafePtr_make2<int>(2); // fail, too many arguments
return 0;
}
std::make_shared
这需要参数?
template <typename T, typename... Args>
ThreadSafePtr<T> ThreadSafePtr_make(Args&&... args)
{
return std::make_shared<ThreadSafeVar<T>>(std::forward<Args>(args)...);
}