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

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

提问人:Jamie Pond 提问时间:1/20/2022 更新时间:1/20/2022 访问量:243

问:

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

我已经毫无问题地完成了我的类型别名,但无法让我的工作。这似乎有点像兔子洞,想知道这里是否有人可以帮我一把?UniquePtrMakeUnique

到目前为止我所拥有的:

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);
}

提前非常感谢!

C++ 17 C++14 标准

评论

0赞 SergeyA 1/20/2022
cannot get my MakeUnique to work- 这不是一个问题。请发布最小的可重复示例。此外,通过说标准名称“丑陋”,您实际上降低了获得良好回应的机会。
1赞 Guillaume Racicot 1/20/2022
snake_case_is_the_best
0赞 SergeyA 1/20/2022
@GuillaumeRacicot就是不:)
0赞 pm100 1/20/2022
你可以写一个宏 /s
1赞 SergeyA 1/20/2022
@GuillaumeRacicot这不是关于你的风格,而是关于;)传教

答:

5赞 Guillaume Racicot 1/20/2022 #1

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

首先,让它编译:

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)...);
}