我怎么可以别名std :: make_shared?

问题描述 投票:0回答:1
我有一个模板包装器

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

这需要参数?


    

c++ templates alias function-pointers make-shared
1个回答
0
投票

template <typename T, typename... Args> ThreadSafePtr<T> ThreadSafePtr_make(Args&&... args) { return std::make_shared<ThreadSafeVar<T>>(std::forward<Args>(args)...); }

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.