vtkSmartPointer类
vtkSmartPointer是一个类模板,为vtkSmartPointerBase超类持有的对象提供自动强制转换。
#ifndef vtkSmartPointer_h
#define vtkSmartPointer_h
#include "vtkSmartPointerBase.h"
#include "vtkMeta.h" // for IsComplete
#include "vtkNew.h" // for vtkNew.h
#include <type_traits> // for is_base_of
#include <utility> // for std::move
template <class T>
class vtkSmartPointer : public vtkSmartPointerBase
{
// 这些静态断言仅在使用调用CheckTypes的函数时触发。
// 因此,只要在使用调用函数时定义了T,这个智能指针类仍然可以用作前向声明T的成员变量。
template <typename U = T>
static void CheckTypes() noexcept
{
// 判断T类型是否已经被定义,是否缺少了include<T>
static_assert(vtk::detail::IsComplete<T>::value,
"vtkSmartPointer<T>'s T type has not been defined. Missing "
"include?");
// 提示不能加载一个无定义的对象类型,事情缺少include<T>
static_assert(vtk::detail::IsComplete<U>::value,
"Cannot store an object with undefined type in "
"vtkSmartPointer. Missing include?");
// 提示不完整的参数类型
static_assert(std::is_base_of<T, U>::value,
"Argument type is not compatible with vtkSmartPointer<T>'s "
"T type.");
// vtkSmartPointer只能被用于vtkObjectBase的子类
static_assert(std::is_base_of<vtkObjectBase, T>::value,
"vtkSmartPointer can only be used with subclasses of "
"vtkObjectBase.");
}
public:
// 初始智能指针内部指针为空;
vtkSmartPointer() noexcept : vtkSmartPointerBase() {}
// 根据传入的智能指针的引用,初始智能指针指向相同的Ojbect;
// 需要两个重载,因为拷贝构造函数必须是非模板的;
vtkSmartPointer(const vtkSmartPointer& r)
: vtkSmartPointerBase(r) { }
template <class U>
vtkSmartPointer(const vtkSmartPointer<U>& r)
: vtkSmartPointerBase(r)
{
vtkSmartPointer::CheckTypes<U>();
}
// 移动语义,将r内的对象转移到this内;
// 需要两个重载,因为移动构造函数必须是非模板的;
vtkSmartPointer(vtkSmartPointer&& r) noexcept : vtkSmartPointerBase(std::move(r)) {}
template <class U>
vtkSmartPointer(vtkSmartPointer<U>&& r) noexcept : vtkSmartPointerBase(std::move(r))
{
vtkSmartPointer::CheckTypes<U>();
}
// 根据传入对象的指针,构造智能指针;
vtkSmartPointer(T* r)
: vtkSmartPointerBase(r)
{
vtkSmartPointer::CheckTypes();
}
// 从vtkNew中的对象Object,复制出一个新的引用,增加了Object的引用计数;
template <typename U>
vtkSmartPointer(const vtkNew<U>& r)
: vtkSmartPointerBase(r.Object)
{
vtkSmartPointer::CheckTypes<U>();
}
// 右值构造函数
// 移动vtkNew中的对象指针,并以此指针构建vtkSmartPointer对象;
// 构造后,将原vtkNew中