巧用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。