Estamos probando una biblioteca en C ++ 11 (es decir, -std=c++11
). La biblioteca usa auto_ptr
y este patrón:
Foo* GetFoo()
{
autoptr<Foo> ptr(new Foo);
// Initialize Foo
ptr->Initialize(...);
// Now configure remaining attributes
ptr->SomeSetting(...);
return ptr.release();
}
C ++ 11 en desuso auto_ptr
, por lo que queremos alejarnos de él.
Sin embargo, el código admite C ++ 03 y C ++ 11, por lo que no es tan simple como arrancar auto_ptr
. También vale la pena mencionar que la biblioteca no tiene dependencias externas. Utiliza C ++ 03; y no usa Autotools, Cmake, Boost, ...
¿Cómo deberíamos manejar los cambios de diseño para alejarnos de auto_ptr
C ++ 11 mientras conservamos la compatibilidad con C ++ 03?
auto_ptr
Alguno de los ámbitos (es decirstd::auto_ptr
), ¿deben ser o se puede obtener el puntero inteligente de algún otro espacio de nombres?Foo::Initialize
enFoo::Foo
.Respuestas:
En la mayoría de los aspectos, el
std::unique_ptr
fue hecho para ser gota en el reemplazo (pero más seguro) parastd::auto_ptr
, por lo que debe ser muy pocos (si los hay) los cambios de código requiere que no sea (como se le pregunte) dirigir el código para utilizar cualquieraunique_ptr
oauto_ptr
.Hay algunas maneras de hacer esto (y cada una viene con sus propias compensaciones de lista) a continuación. Dado el ejemplo de código proporcionado, preferiría cualquiera de las dos primeras opciones .
Opción 1
Compensaciones;
auto_ptr
nombre en el espacio de nombres global; puede mitigar esto definiendo que es su propio espacio de nombres "privado"auto_ptr
que se eliminará por completo), puede buscar y reemplazar más fácilmenteopcion 2
Compensaciones;
auto_ptr
necesidad actual de cambiar en el código a algo comomy_ptr<T>::ptr
Opción 3
Algo controvertido, pero si estás preparado para soportar las advertencias de tener una
std
clase como baseCompensaciones;
Opcion 4
Envuelva los punteros en una nueva clase y agregue las funciones requeridas al miembro
Compensaciones;
fuente
tr1
espacio de nombres no ya no estoy allí (uso libc ++ y no libstdc ++). Sé que tr1 no era normativo, pero no puedo encontrar en ninguna parte del borrador (aquí) que los archivos tenían que estar<tr1/...>
en absoluto, de hecho menciona que solo está en el encabezado,<memory>
etc., solo en eltr1
espacio de nombres.CXX=...
).c++ -v -std=c++11 -x c++ - < /dev/null
. Yogrep'd
incluyo los directorios que fueron volcados, y no incluyenunique_ptr
.Opción 5: alias directo.
Compensaciones:
Para versiones de idiomas más recientes, AKA C ++ 11 y posteriores, su tipo de alias se asigna al puntero inteligente correcto. El compilador marcará cualquier código de usuario que realmente dependa de las API específicas de std :: auto_ptr, que es la máxima garantía de que realmente se solucionará.
En el modo Legacy c ++ 03, el alias de tipo es una macro. Esto es asqueroso, pero la sintaxis resultante
MyPtr<T>
será idéntica al caso de C ++ 11 en el resto del código.Tiene que encontrar y cambiar todas sus variables auto_ptr
MyPtr
para configurar esto.fuente