Estamos testando uma biblioteca em C ++ 11 (ou seja, -std=c++11
). A biblioteca usa auto_ptr
e esse padrão:
Foo* GetFoo()
{
autoptr<Foo> ptr(new Foo);
// Initialize Foo
ptr->Initialize(...);
// Now configure remaining attributes
ptr->SomeSetting(...);
return ptr.release();
}
O C ++ 11 foi descontinuado auto_ptr
, então queremos nos afastar dele.
No entanto, o código suporta C ++ 03 e C ++ 11, portanto, não é tão simples quanto puxar auto_ptr
. Também vale mencionar que a biblioteca não possui dependências externas. Ele usa C ++ 03; e não usa Autotools, Cmake, Boost, ...
Como devemos lidar com as alterações de design para se afastar do auto_ptr
C ++ 11, mantendo a compatibilidade com o C ++ 03?
auto_ptr
escopos (iestd::auto_ptr
), eles precisam ser ou o ponteiro inteligente pode ser obtido de algum outro espaço para nome?Foo::Initialize
emFoo::Foo
.Respostas:
Em muitos aspectos, a
std::unique_ptr
substituição foi feita (mas é mais segura)std::auto_ptr
, portanto, deve haver muito poucas (se houver) alterações de código necessárias além de (como você pede) direcionando o código para usar umunique_ptr
ou outroauto_ptr
.Existem algumas maneiras de fazer isso (e cada uma vem com suas próprias vantagens e desvantagens da lista) abaixo. Dado o exemplo de código fornecido, eu preferiria uma das duas primeiras opções .
Opção 1
Tradeoffs;
auto_ptr
nome no espaço para nome global; você pode atenuar isso definindo que é seu próprio espaço para nome "privado"auto_ptr
que será completamente removido), você poderá pesquisar e substituir mais facilmenteopção 2
Tradeoffs;
auto_ptr
necessidade atual mudou de código para algo comomy_ptr<T>::ptr
Opção 3
Um tanto controverso, mas se você estiver preparado para aguentar as advertências de ter uma
std
classe como baseTradeoffs;
Opção 4
Coloque os ponteiros em uma nova classe e agregue as funções necessárias ao membro
Tradeoffs;
fonte
tr1
namespace no por mais tempo (eu uso libc ++ e não libstdc ++). Eu sei que o tr1 não é normativo, mas não consigo encontrar em nenhum lugar do rascunho (aqui) que os arquivos precisavam estar<tr1/...>
, o fato é que ele menciona estar apenas no cabeçalho<memory>
etc. arquivo apenas notr1
namespace.CXX=...
).c++ -v -std=c++11 -x c++ - < /dev/null
. Igrep'd
a incluir diretórios que foram objecto de dumping, e eles não incluemunique_ptr
.Opção 5: Alias direto.
Compensações:
Para versões mais recentes do idioma, AKA C ++ 11 e posterior, seu tipo de alias é mapeado para o ponteiro inteligente correto. Qualquer código de usuário que realmente dependa de APIs específicas para std :: auto_ptr será sinalizado pelo compilador, que é a garantia máxima de que realmente será corrigido.
No modo Legacy c ++ 03, o alias de tipo é uma macro. Isso é grosseiro, mas a sintaxe resultante
MyPtr<T>
será idêntica ao caso do C ++ 11 em todo o restante do código.Você precisa encontrar e alterar todas as suas variáveis auto_ptr
MyPtr
para configurar isso.fonte