如何为 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)...);
}
我想为 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)...);
}