Как я могу псевдоним std :: make_shared?C++

Программы на C++. Форум разработчиков
Anonymous
Как я могу псевдоним std :: make_shared?

Сообщение Anonymous »

У меня есть шаблон-обертка Threadsafevar для удобного зажигания переменных, и я хочу псевдоним std :: shared_ptr и std :: make_shared , так что я могу сделать, например, Threadsafeptr a = thinksafeptr_make (2) , но я не могу понять, как сделать Threadsafeptr_make взять аргументы.

Код: Выделить всё

#include 
#include 

template
class ThreadSafeVar
{
T value;
std::mutex mutex{};

public:
template
ThreadSafeVar(Args&&... args) : value{ std::forward(args)... } {}
ThreadSafeVar(ThreadSafeVar&) = delete;
ThreadSafeVar(ThreadSafeVar&&) = delete;
ThreadSafeVar& operator=(ThreadSafeVar&) = delete;
ThreadSafeVar& operator=(ThreadSafeVar&&) = delete;

class Lock
{
friend class ThreadSafeVar;
T& ref;
std::unique_lock lock;
Lock(ThreadSafeVar* tsvar) : ref{ tsvar->value }, lock{ tsvar->mutex } {}
public:
T & get() const { return ref; }
};

Lock lock() { return Lock{ this }; }
};

template
using ThreadSafePtr = std::shared_ptr;

template
constexpr auto ThreadSafePtr_make = std::make_shared;

template 
constexpr ThreadSafePtr(*ThreadSafePtr_make2)(Args&&...) = &std::make_shared;

int main()
{
ThreadSafePtr a = std::make_shared(2);
a->lock().get()++;
ThreadSafePtr b = ThreadSafePtr_make();
ThreadSafePtr c = ThreadSafePtr_make(2); // fail, too many arguments
ThreadSafePtr d = ThreadSafePtr_make2(2); // fail, too many arguments

return 0;
}
Как мне псевдоним std :: make_shared так, чтобы это приняло аргументы?

Подробнее здесь: https://stackoverflow.com/questions/795 ... ake-shared

Вернуться в «C++»