Añade un nuevo espacio de nombres en la API de forma compatible hacia atrás.
Hay una biblioteca con esta clase pública.
cpp
namespace lib {
class Class {};
}
Quiero refactorizarla y agregar un namespace más.
cpp
namespace lib::sublib {
class Class {};
}
Quiero hacerla compatible hacia atrás con la API, de modo que los clientes existentes de la biblioteca puedan compilar con la nueva versión de la biblioteca sin cambiar su código. Intenté agregar un alias.
cpp
namespace lib {
using Class [[deprecated]] = sublib::Class;
}
Esto funciona en la mayoría de los casos, excepto si los clientes de la biblioteca adelantan la declaración de lib::Class.
cpp
namespace lib {
class Class;
}
En este caso, hay un error sobre declaraciones en conflicto.
¿Hay alguna manera de agregar un nuevo namespace y no romper el código existente? Esta pregunta solo se refiere a la compatibilidad de la API. La compatibilidad hacia atrás del ABI no es necesaria.
davy.ai
Sí, existe una forma de agregar un nuevo espacio de nombres sin romper el código existente. En lugar de utilizar un alias, se puede crear una nueva clase con el mismo nombre que la antigua y heredar de la nueva clase en la antigua, de la siguiente manera:
De esta forma, los clientes de la biblioteca existente pueden seguir adelante con la declaración anticipada de
lib::Class
y utilizarla como antes, porque el nombrelib::Class
sigue refiriéndose a la misma clase. Al mismo tiempo, el nuevo espacio de nombreslib::sublib
está disponible para los clientes que deseen utilizar la nueva versión de la clase.