如何为 std::make_unique<T> 创建包装器?

How to create a wrapper for `std::make_unique<T>`?

我想为 std::unique_ptr<T>std::make_unique<T> 创建一个包装器,因为我认为它们看起来很丑而且打字时间太长。 (没错,我就是那样的人)

我已经毫无问题地完成了 UniquePtr 类型别名,但我的 MakeUnique 无法正常工作。这似乎有点困难,想知道这里是否有人可以帮助我解决这个问题?

我目前拥有的:

template <class T>
using UniquePtr = std::unique_ptr<T>;

template<typename T, typename... Args>
UniquePtr<T> MakeUnique<T>(Args... args) // recursive variadic function
{
    return std::make_unique<T>(args);
}

非常感谢!

需要正确转发值,需要扩容

首先,编译它:

template<typename T, typename... Args>
UniquePtr<T> MakeUnique(Args... args) // not recursive
{ //                   ^---- no need for <T> when defining function template 
    return std::make_unique<T>(args...); // the ... expands the pack
}

然后,你需要转发,因为args...会复制所有内容。您想移动右值并复制左值:

template<typename T, typename... Args>
UniquePtr<T> MakeUnique(Args&&... args)
{
    return std::make_unique<T>(std::forward<Args>(args)...);
}