巧用c++11 的forward实现可变参数构造,生成智能指针

C++11 提供强大的智能指针shared_ptr来管理内存,避免使用裸指针带来的各种不确定访问造成的程序崩溃。

为了强制使用智能指针,一个简单的办法是,将类的构造函数析构函数声明为protected,防止new实例。

但是这个办法有一个缺陷,子类继承之后,无法拦截new的访问。

缺陷先不管,一个团队里面编码,这些规则应该写进规范

基于这个原理,可以构造自己的智能指针实例生成模板函数

如下所示:

 1 namespace JOJODRU {
 2     template<typename T, typename... ARG>
 3     std::shared_ptr<T> CreateInstance(ARG&&... args)
 4     {
 5         struct TEnableShared : public T
 6         {
 7             TEnableShared(ARG&&... args)
 8                 : T(std::forward<ARG>(args)...)
 9             {}
10         };
11 
12         return std::make_shared<TEnableShared>(std::forward<ARG>(args)...);
13     }
14 }

我们使用std的forward帮我们转发可变参数列表给相应的构造函数来实例化模板

同时,工作中,可以约定T的构造函数和析构函数都应该声明为protected。

 

posted @ 2017-04-05 16:42  Jojodru  阅读(1178)  评论(0编辑  收藏  举报