Dla kodu, nad którym obecnie pracuję, czasami musimy skompilować na niektórych starszych systemach ze starszymi kompilatorami (np. - uruchamiamy simy na starszym IBM BlueGene/L, którego umowa o wsparcie dyktuje dość stary kompilator C++). Sam kod korzysta z shared_ptrs i został pierwotnie napisany w celu użycia std :: tr1 :: shared_ptr. Podczas kompilacji na starym komputerze BlueGene szybko zorientowałem się, że nie ma on implementacji tr1 ::, więc przełączyłem się na boost :: shared_ptr. Okazuje się, że istnieje również boost :: tr1 :: shared_ptr. Teraz, gdy kod jest wykorzystywany szerzej poza naszą grupą badawczą, przenośność staje się jeszcze ważniejsza.Jak radzić sobie z ewoluującym C++ std :: namespace? np: std :: tr1 :: shared_ptr vs. std :: shared_ptr vs. boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
Co to jest (?) Najlepsza praktyka do obsługi tego rodzaju ewoluujących problemów ze standardową biblioteką w wielkiej bazie kodu? Zakładam, że w nowym standardzie C++ 11 shared_ptr nie będzie już w przestrzeni nazw tr1, co dodaje kolejny potencjał: std :: shared_ptr, jednak domyślam się, że powszechne wsparcie dla tego będzie odbiegało. Chciałbym używać najnowszego standardu, jeśli to możliwe, ale muszę zachować przenośność. Czy powinienem po prostu trzymać się dopalacza?
Istnieją już kompilatory gdzie 'std :: shared_ptr' jest dostępny, podobnie jak VC2010 i najnowsze wersje g ++.Jeśli potrzebujesz obsługi wielu różnych kompilatorów, trzymanie się boost jest prawdopodobnie najłatwiejsze. :) – Sven
Tylko dlatego, że shared_ptr zostanie dodane do przestrzeni nazw std :: nie znaczy, że będzie * usunięte * z namespace std :: tr1 ::. Wiem, że gcc/libstdC++ będzie utrzymywało obydwa naprzód. W rzeczywistości jestem pewien, że visual studio będzie takie samo. – emsr
Myślę, że jeśli się rozejrzysz, obsługa std :: shared_ptr jest bardzo szeroka w większości kompilatorów w ciągu ostatnich dwóch lat. Trzymałbym się std :: first, potem szukam std :: tr1 :: następnie spróbuj boost w tej kolejności. – emsr