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

Jam*_*ond 1 c++ std c++14 c++17

我想为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);
}
Run Code Online (Sandbox Code Playgroud)

提前谢谢了!

Gui*_*cot 5

您需要正确转发值,并且需要扩展包。

首先,使其编译:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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