Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

PrevUpHomeNext

函数 deconstruct

boost::signals2::deconstruct — 创建一个支持后构造器和前析构器的 shared_ptr

概要

// In header: <boost/signals2/deconstruct.hpp>


template<typename T> postconstructor_invoker<T> deconstruct();
template<typename T, typename A1> 
  postconstructor_invoker<T> deconstruct(const A1 & arg1);
template<typename T, typename A1, typename A2> 
  postconstructor_invoker<T> deconstruct(const A1 & arg1, const A2 & arg2);
template<typename T, typename A1, typename A2, ..., typename AN> 
  postconstructor_invoker<T> 
  deconstruct(const A1 & arg1, const A2 & arg2, ..., const AN & argN);

描述

使用单次分配创建一个对象及其拥有 shared_ptr<T>(包装在 postconstructor_invoker 中),方式类似于 boost::make_shared()。此外,deconstruct 支持后构造器和前析构器。返回的 shared_ptr 包装在 postconstructor_invoker 中,以便用户有机会将参数传递给后构造器,同时确保在访问包装的 shared_ptr 之前运行后构造器。

为了使用 deconstruct,必须为您的类定义一个后构造器。更具体地说,您必须定义一个可通过参数相关查找找到的 adl_postconstruct 函数。通常,这意味着在与其关联的类相同的命名空间中定义一个 adl_postconstruct 函数。有关传递给 adl_postconstruct 调用的参数规范,请参见 postconstructor_invoker 的参考。

可以选择为您的类定义一个前析构器。这是通过定义一个可通过参数相关查找找到的 adl_predestruct 函数来完成的。由 deconstruct 创建的 shared_ptr 的删除器将对 adl_predestruct 进行非限定调用,该调用带有一个参数:指向即将被删除的对象的指针。为方便起见,在传递给 adl_predestruct 之前,该指针将始终转换为指向非常量类型的指针。如果通过参数相关查找找不到用户定义的 adl_predestruct 函数,则将使用默认函数(不执行任何操作)。调用 adl_predestruct 后,删除器将使用 checked_delete 删除该对象。

传递给 deconstruct() 调用的任何参数都将转发到模板类型 T 的匹配构造函数。也可以通过使用 postconstructor_invoker::postconstruct() 方法将参数传递给类的关联 adl_postconstruct 函数。

注释

如果您的编译器支持右值引用和可变参数模板的 C++11 功能,则 deconstruct 将使用以下原型将参数完美转发到 T 构造函数:

template< typename T, typename... Args > postconstructor_invoker< T > deconstruct( Args && ... args );

否则,参数转发将通过常量引用执行,如概要中所述。为了将非常量引用传递给构造函数,您需要使用 boost::ref 将它们包装在引用包装器中。

您可以通过声明 deconstruct_access 为友元,让所有 deconstruct 重载访问您类的私有和受保护的构造函数。将私有构造函数与 deconstruct_access 结合使用,可以确保您的对象仅由 deconstruct 创建,从而始终调用其后构造器或前析构器。

返回值

一个拥有类型为 T 的新分配对象的 postconstructor_invoker<T>


PrevUpHomeNext