使獨特和完美的轉發為什么沒有std::make_unique標準C+11庫中的函數模板?我發現std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));有點冗長。下面這些不是更好嗎?auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);這隱藏了new很好,只提到過一次類型。無論如何,下面是我試圖實現的make_unique:template<typename T, typename... Args>std::unique_ptr<T> make_unique(Args&&... args){
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));}我花了好長時間才弄到std::forward需要編譯的東西,但我不確定它是否正確。是嗎?究竟是什么std::forward<Args>(args)...刻???編譯器對此有何看法?
3 回答
慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
make_unique
#include <memory>#include <type_traits>#include <utility>template <typename T, typename... Args>std:
:unique_ptr<T> make_unique_helper(std::false_type, Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));}template <typename T, typename... Args>std:
:unique_ptr<T> make_unique_helper(std::true_type, Args&&... args) {
static_assert(std::extent<T>::value == 0,
"make_unique<T[N]>() is forbidden, please use make_unique<T[]>().");
typedef typename std::remove_extent<T>::type U;
return std::unique_ptr<T>(new U[sizeof...(Args)]{std::forward<Args>(args)...});}template <typename T, typename...
Args>std::unique_ptr<T> make_unique(Args&&... args) {
return make_unique_helper<T>(std::is_array<T>(), std::forward<Args>(args)...);}
aluckdog
TA貢獻1847條經驗 獲得超7個贊
std::make_sharedstd::shared_ptr<Type> ptr(new Type(...));
std::shared_ptrstd::make_sharedstd::make_shared
std::shared_ptr<Type> ptr = new Type(...);newstd::shared_ptrstd::make_shared<Type>(...)
std::shared_ptrstd::make_unique
- 3 回答
- 0 關注
- 444 瀏覽
添加回答
舉報
0/150
提交
取消
