std:: inout_ptr_t
|
Definido en el encabezado
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class inout_ptr_t ; |
(desde C++23) | |
inout_ptr_t
se utiliza para adaptar tipos como punteros inteligentes para funciones externas que restablecen la propiedad mediante un parámetro
Pointer*
(generalmente
T**
para algún tipo de objeto
T
) o
void
**
.
inout_ptr_t
captura argumentos adicionales en la construcción, proporciona un almacenamiento para el resultado que dicha función externa antes mencionada accede, libera la propiedad mantenida por el objeto
Smart
adaptado, y finalmente restablece el objeto
Smart
adaptado con el resultado y los argumentos capturados cuando es destruido.
inout_ptr_t
se comporta como si contuviera los siguientes miembros de datos no estáticos:
-
una referencia
Smart&, que se vincula al objeto adaptado durante la construcción, -
para cada
TenArgs..., un miembro de tipoT, que es un argumento capturado durante la construcción y utilizado para el restablecimiento durante la destrucción, y -
un subobjeto miembro adecuado para almacenar un
Pointerdentro de él y proporcionar un objeto void * , donde el objetoPointero void * generalmente se expone a una función externa para el restablecimiento de propiedad.
Si
Smart
no es un tipo puntero,
release
(
)
se llama como máximo una vez al objeto adaptado. Las implementaciones pueden llamar
release
(
)
dentro del constructor, o antes del reinicio dentro del destructor si el valor de
Pointer
no es nulo.
Los usuarios pueden controlar si cada argumento para el restablecimiento se captura por copia o por referencia, especificando un tipo de objeto o un tipo de referencia en
Args...
respectivamente.
Contenidos |
Parámetros de plantilla
| Smart | - | el tipo del objeto (normalmente un puntero inteligente) a adaptar |
| Pointer | - | tipo del objeto (normalmente un puntero en bruto) al que una función externa accede para el restablecimiento de propiedad |
| Args... | - | tipo de argumentos capturados utilizados para restablecer el objeto adaptado |
| Requisitos de tipo | ||
-
Pointer
debe cumplir con los requisitos de
NullablePointer
.
|
||
-
Smart
es una especialización de
std::shared_ptr
.
|
||
Especializaciones
A diferencia de la mayoría de las plantillas de clase en la biblioteca estándar,
las
especializaciones definidas por el programa
de
inout_ptr_t
que dependen de al menos un
tipo definido por el programa
no necesitan cumplir con los requisitos de la plantilla principal.
Esta licencia permite que una especialización definida por el programa exponga el puntero en bruto almacenado dentro de un puntero inteligente no estándar a funciones externas.
Funciones miembro
|
(C++23)
|
construye un
inout_ptr_t
(función miembro pública) |
|
operator=
[eliminado]
(C++23)
|
inout_ptr_t
no es asignable
(función miembro pública) |
|
(C++23)
|
reinicia 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 salida
(función miembro pública) |
Funciones no miembro
|
(C++23)
|
crea un
inout_ptr_t
con un puntero inteligente asociado y argumentos de reinicio
(plantilla de función) |
Notas
inout_ptr_t
espera que las funciones externas liberen la propiedad representada por el valor del
Pointer
apuntado, y luego lo reinicialicen. Dado que esta 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 inmediatamente el puntero inteligente adaptado. Por ejemplo, dada una función establecedora y un puntero inteligente del tipo apropiado declarado 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
con una
duración de almacenamiento
diferente a la duración de almacenamiento automática, porque dicho código probablemente producirá referencias colgantes y resultará en comportamiento indefinido durante la destrucción.
Los argumentos capturados típicamente se empaquetan en un
std::
tuple
<
Args...
>
. Las implementaciones pueden utilizar diferentes mecanismos para proporcionar el objeto
Pointer
o
void
*
que necesitan contener.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_out_ptr
|
202106L
|
(C++23) |
std::out_ptr
,
std::inout_ptr
|
202311L
|
(C++26) |
Implementación independiente de
std::out_ptr
y
std::inout_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 propiedad única de objetos
(plantilla de clase) |
|
(C++11)
|
puntero inteligente con semántica de propiedad compartida de objetos
(plantilla de clase) |