Testujemy bibliotekę pod C ++ 11 (tj -std=c++11
.). Biblioteka korzysta z auto_ptr
tego wzoru:
Foo* GetFoo()
{
autoptr<Foo> ptr(new Foo);
// Initialize Foo
ptr->Initialize(...);
// Now configure remaining attributes
ptr->SomeSetting(...);
return ptr.release();
}
C ++ 11 jest przestarzałe auto_ptr
, więc chcemy się od niego odejść.
Jednak kod obsługuje zarówno C ++ 03, jak i C ++ 11, więc nie jest to takie proste jak szarpanie auto_ptr
. Warto również wspomnieć, że biblioteka nie ma zewnętrznych zależności. Używa C ++ 03; i nie używa Autotools, Cmake, Boost, ...
Jak powinniśmy poradzić sobie ze zmianami w projekcie, aby odejść auto_ptr
dla C ++ 11, zachowując zgodność z C ++ 03?
auto_ptr
zakresów (tj.std::auto_ptr
), Czy musi być, czy też inteligentny wskaźnik można uzyskać z innej przestrzeni nazw?Foo::Initialize
doFoo::Foo
.Odpowiedzi:
W większości względami
std::unique_ptr
powstał być spadek (ale bezpieczniej) zamiennikstd::auto_ptr
, więc nie powinno być bardzo niewiele (jeśli w ogóle) wymaga zmiany kodu innego niż (jak pytasz) kierowanie kod do używania albounique_ptr
alboauto_ptr
.Istnieje kilka sposobów, aby to zrobić (i każdy ma swoje własne kompromisy listy) poniżej. Biorąc pod uwagę przykładowy kod, wolałbym jedną z dwóch pierwszych opcji .
opcja 1
Kompromisy;
auto_ptr
nazwę do globalnej przestrzeni nazw; możesz to złagodzić, definiując swoją własną „prywatną” przestrzeń nazwauto_ptr
zostanie całkowicie usunięty) możesz łatwiej wyszukiwać i zamieniaćOpcja 2
Kompromisy;
auto_ptr
potrzeba zmiany w kodzie na coś podobnegomy_ptr<T>::ptr
Opcja 3
Nieco kontrowersyjne, ale jeśli jesteś gotowy pogodzić się z zastrzeżeniami dotyczącymi posiadania
std
klasy jako podstawyKompromisy;
Opcja 4
Zawiń wskaźniki w nową klasę i agreguj wymagane funkcje do elementu członkowskiego
Kompromisy;
źródło
tr1
przestrzeń nazw nie już tam jestem (używam libc ++, a nie libstdc ++). Wiem, że tr1 był nienormatywny, ale nie mogę nigdzie znaleźć w szkicu (tutaj), że pliki<tr1/...>
w ogóle musiały być , w rzeczywistości wspomina tylko o byciu w<memory>
pliku nagłówka itp. Tylko wtr1
przestrzeni nazw.CXX=...
).c++ -v -std=c++11 -x c++ - < /dev/null
. Igrep'd
obejmują katalogi, które zostały zrzucone i nie zawierająunique_ptr
.Opcja 5: Bezpośredni alias.
Kompromisy:
W przypadku nowszych wersji językowych, AKA C ++ 11 i nowszych, alias jest odwzorowywany na poprawny inteligentny wskaźnik. Każdy kod użytkownika, który faktycznie zależy od API specyficznych dla std :: auto_ptr, zostanie oflagowany przez kompilator, co jest ostateczną gwarancją, że naprawdę zostanie naprawiony.
W trybie Legacy c ++ 03 alias typu to makro. Jest to obrzydliwe, ale wynikowa składnia
MyPtr<T>
będzie identyczna jak w przypadku C ++ 11 w pozostałej części kodu.Musisz znaleźć i zmienić wszystkie zmienne auto_ptr na
MyPtr
, aby to skonfigurować.źródło