2011-10-01 60 views
1

在C++ 11中,我缺少一個用於將指針分解爲std::unique_ptr的合成糖。因此,我寫了以下小幫手函數std::uniquify_ptr,通常用於易變(非構造函數)賦值的可變類成員(通常是不同種類的緩存)。C++ 11指針唯一化幫助函數

#include <memory> 

namespace std 
{ 
    template<typename T> 
    inline unique_ptr<T> uniquify_ptr(T* ptr) 
    { 
     return unique_ptr<T>(ptr); 
    } 
} 

我失去了從安全來看這裏的東西嗎?是否有一些類似的功能可用?

回答

2

unique_ptr<T>已經可以直接從T*構建,所以幾乎沒有必要。這種工廠功能除了語法糖之外幾乎沒有用處,例如auto x = make_unique<T>(...);。此外,您的move是多餘的。

+0

我的工廠函數'std :: uniquify_ptr(ptr)'的整個想法是編譯器可以從'ptr'推導出模板參數。爲什麼不能'std :: unique_ptr '爲我猜'T'?我已經在GCC-4.6.1上測試了這些東西。 –

3

不,現在沒有類似的功能可用。如何

auto ptr(std::uniquify_ptr(new T())); 

任何優於

std::unique_ptr<T> ptr(new T()); 

?即,爲什麼應該這存在?如果有的話,這不會節省你很多。

+1

我從片段中刪除'的std :: move' 。我仍然認爲它更方便,因爲'T'可以從我的包裝中的參數中推導出來。例如,編寫'std :: uniquify_ptr(ptr)'而不是'std :: unique_ptr (ptr)'就足夠了。 –

+0

如果名字'T'的長度超過6個字符,則'uniquify_ptr'方法開始付清:) –

+0

是'make_' ...某種C++/Boost命名工廠函數的標準方式嗎? –

0

@Schaub:我使用這變化現有可變std::unique_ptr類成員的值。在這種情況下

m_hashA = std::uniquify(new Hashes(cnt)); 

m_hashA = std::unique_ptr<Hashes>(new Hashes(cnt))); 

更方便維爾成員被聲明爲

mutable std::unique_ptr<Hashes> m_hashA; ///< Hash Table for Alternatives. 

感謝