std::inout_ptr_t
| Definido en el archivo de encabezado <memory>
|
||
template< class Smart, class Pointer, class... Args > class inout_ptr_t; |
(desde C++23) | |
inout_ptr_t se usa para adaptar tipos como punteros inteligentes para funciones externas que generan sus resultados a través de un Pointer* (generalmente T** para algún tipo de objeto T) o parámetro void**.
inout_ptr_t captura argumentos adicionales durante la construcción, proporciona un almacenamiento para el resultado al que accede dicha función externa mencionada anteriormente, libera la propiedad del objeto Smart adaptado y, finalmente, restablece el objeto Smart adaptado con el resultado y los argumentos capturados cuando se destruye.
inout_ptr_t se comporta como si tuviera los siguientes datos miembro no estáticos:
- una referencia
Smart&, que está vinculada al objeto adaptado durante la construcción, - para cada
TenArgs..., un miembro de tipoT, que es un argumento capturado durante la construcción y usado para restablecer durante la destrucción, y - un subobjeto miembro que es adecuado para almacenar un
Pointerdentro de él y para proporcionar un objetovoid*, dondePointero el objetovoid*generalmente está expuesto a una función externa para restablecer la propiedad.
Si Smart no es un tipo puntero, se llama a release() a lo sumo una vez sobre el objeto adaptado. Las implementaciones pueden llamar a release() dentro del constructor, o antes de restablecer dentro del destructor si el valor de Pointer no es nulo.
Los usuarios pueden controlar si cada argumento a restablecer se captura por copia o por referencia, especificando un tipo objeto o un tipo referencia en Args... respectivamente.
Parámetros de plantilla
| Smart | - | El tipo de objeto (típicamente un puntero inteligente) a adaptar. |
| Pointer | - | El tipo del objeto (normalmente un puntero sin formato) al que accede una función externa para restablecer la propiedad. |
| Args... | - | El tipo de los argumentos capturados utilizados para restablecer el objeto adaptado. |
| Requisitos de tipo | ||
-Pointer debe satisfacer los requisitos de NullablePointer.
| ||
-El programa está mal formado si Smart es una especialización de std::shared_ptr.
| ||
Especializaciones
A diferencia de la mayoría de las plantillas de clase de la biblioteca estándar, las especializaciones de inout_ptr_t definidas por el programa que dependen de al menos un tipo definido por el programa no necesitan cumplir con los requerimientos de la plantilla principal.
Esta licencia permite que una especialización definida por el programa exponga el puntero sin formato almacenado en un puntero inteligente no estándar a las funciones externas.
Funciones miembro
(C++23) |
Construye un inout_ptr_t. (función miembro pública) |
operator= [eliminada](C++23) |
inout_ptr_t no es asignable. (función miembro pública) |
(C++23) |
Restablece el puntero inteligente adaptado después de liberar su propiedad. (función miembro pública) |
Convierte el inout_ptr_t a la dirección del almacenamiento para la salida. (función miembro pública) |
Funciones no miembro
(C++23) |
Crea un objeto inout_ptr_t con un puntero inteligente asociado y los argumentos de restablecimiento. (plantilla de función) |
Notas
inout_ptr_t espera que las funciones externas liberen la propiedad representada por el valor al que apunta Pointer y luego lo reinicialicen. Como tal operación requiere propiedad única, el uso con std::shared_ptr está prohibido.
El uso típico de inout_ptr_t es crear sus objetos temporales mediante std::inout_ptr, que restablece el puntero inteligente adaptado inmediatamente. Por ejemplo, dada una función establecedora (setter) y un puntero inteligente del tipo apropiado declarada con int foreign_resetter(T**); y std::unique_ptr<T, D> up; respectivamente,
if (int ec = foreign_resetter(std::inout_ptr(up)) {
return ec;
}
es aproximadamente equivalente a
T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0) {
return ec;
}
No se recomienda crear un objeto inout_ptr_t de una duración de almacenamiento que no sea la duración de almacenamiento automática, porque es probable que dicho código produzca referencias pendientes y resulte en un comportamiento no definido durante la destrucción.
Los argumentos capturados normalmente se empaquetan en std::tuple<Args...>. Las implementaciones pueden usar diferentes mecanismos para proporcionar el objeto Pointer o void* que necesitan retener.
| Macro de Prueba de característica |
|---|
__cpp_lib_out_ptr
|
Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |
Véase también
(C++23) |
Interopera con establecedores de punteros externos y restablece un puntero inteligente en la destrucción. (plantilla de clase) |
(C++11) |
Puntero inteligente con semántica de posesión de objeto única. (plantilla de clase) |
(C++11) |
Puntero inteligente con semántica de posesión de objeto compartida. (plantilla de clase) |