2011-10-01 59 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. 

感谢