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 功能,则 template< typename T, typename... Args > postconstructor_invoker< T > deconstruct( Args && ... args ); 否则,参数转发将通过常量引用执行,如概要中所述。为了将非常量引用传递给构造函数,您需要使用 boost::ref 将它们包装在引用包装器中。 您可以通过声明 deconstruct_access 为友元,让所有 |
返回值 |
一个拥有类型为 |