Nous testons une bibliothèque sous C ++ 11 (ie, -std=c++11
). La bibliothèque utilise auto_ptr
et ce modèle:
Foo* GetFoo()
{
autoptr<Foo> ptr(new Foo);
// Initialize Foo
ptr->Initialize(...);
// Now configure remaining attributes
ptr->SomeSetting(...);
return ptr.release();
}
C ++ 11 déconseillé auto_ptr
, nous voulons donc nous en éloigner.
Cependant, le code prend en charge à la fois C ++ 03 et C ++ 11, ce n'est donc pas aussi simple que de tirer auto_ptr
. Il convient également de mentionner que la bibliothèque n'a pas de dépendances externes. Il utilise C ++ 03; et n'utilise pas Autotools, Cmake, Boost, ...
Comment gérer les modifications de conception pour s'éloigner de auto_ptr
C ++ 11 tout en conservant la compatibilité avec C ++ 03?
auto_ptr
zones de portée (c.-à-d.std::auto_ptr
), Doivent- elles l'être ou le pointeur intelligent peut-il être obtenu à partir d'un autre espace de noms?Foo::Initialize
enFoo::Foo
.Réponses:
À la plupart des égards, le
std::unique_ptr
remplacement a été fait (mais plus sûr)std::auto_ptr
, donc il ne devrait y avoir que très peu (le cas échéant) de modifications de code autres que (comme vous le demandez) de demander au code d'utiliser soitunique_ptr
ouauto_ptr
.Il y a quelques façons de le faire (et chacune vient avec sa propre liste de compromis) ci-dessous. Compte tenu de l'exemple de code fourni, je préférerais l'une des deux premières options .
Option 1
Compromis;
auto_ptr
nom dans l'espace de noms global; vous pouvez atténuer cela en le définissant comme votre propre espace de noms "privé"auto_ptr
qu'il sera complètement supprimé), vous pouvez plus facilement rechercher et remplacerOption 2
Compromis;
auto_ptr
besoin actuel de changer dans le code pour quelque chose commemy_ptr<T>::ptr
Option 3
Un peu controversé, mais si vous êtes prêt à accepter les mises en garde d'avoir une
std
classe comme baseCompromis;
Option 4
Envelopper les pointeurs dans une nouvelle classe et agréger les fonctions requises au membre
Compromis;
la source
tr1
espace de noms non étant plus là (j'utilise libc ++ et non libstdc ++). Je sais que tr1 n'était pas normatif, mais je ne trouve nulle part dans le brouillon (ici) que les fichiers devaient être<tr1/...>
du tout, en fait il mentionne simplement être dans le<memory>
fichier d' en-tête, etc. juste dans l'tr1
espace de noms.CXX=...
).c++ -v -std=c++11 -x c++ - < /dev/null
. J'inclusgrep'd
les répertoires qui ont été vidés, et ils ne comprennent pasunique_ptr
.Option 5: alias direct.
Compromis:
Pour les versions de langage plus récentes, AKA C ++ 11 et versions ultérieures, votre type d'alias correspond au pointeur intelligent approprié. Tout code utilisateur qui dépend en fait des API spécifiques à std :: auto_ptr sera signalé par le compilateur, ce qui est la garantie ultime qu'il sera vraiment corrigé.
En mode Legacy c ++ 03, l'alias de type est une macro. C'est brut, mais la syntaxe résultante
MyPtr<T>
sera identique au cas C ++ 11 dans le reste du code.Vous devez trouver et modifier toutes vos variables auto_ptr
MyPtr
afin de configurer cela.la source