Estamos probando una biblioteca en C ++ 11 (es decir, -std=c++11). La biblioteca usa auto_ptry 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_ptrC ++ 11 mientras conservamos la compatibilidad con C ++ 03?

auto_ptrAlguno de los ámbitos (es decirstd::auto_ptr), ¿deben ser o se puede obtener el puntero inteligente de algún otro espacio de nombres?Foo::InitializeenFoo::Foo.Respuestas:
En la mayoría de los aspectos, el
std::unique_ptrfue 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_ptroauto_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_ptrnombre en el espacio de nombres global; puede mitigar esto definiendo que es su propio espacio de nombres "privado"auto_ptrque se eliminará por completo), puede buscar y reemplazar más fácilmenteopcion 2
Compensaciones;
auto_ptrnecesidad actual de cambiar en el código a algo comomy_ptr<T>::ptrOpción 3
Algo controvertido, pero si estás preparado para soportar las advertencias de tener una
stdclase como baseCompensaciones;
Opcion 4
Envuelva los punteros en una nueva clase y agregue las funciones requeridas al miembro
Compensaciones;
fuente
tr1espacio 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 eltr1espacio de nombres.CXX=...).c++ -v -std=c++11 -x c++ - < /dev/null. Yogrep'dincluyo 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
MyPtrpara configurar esto.fuente