Które funkcje Boost pokrywają się z C ++ 11?

191

Umieściłem swoje umiejętności C ++ na półce kilka lat temu i wydaje się, że kiedy znów ich potrzebuję, krajobraz się zmienił.

Mamy teraz C ++ 11 i rozumiem, że nakłada się on na wiele funkcji Boost.

Czy jest jakieś podsumowanie, gdzie leżą te nakładki, które biblioteki Boost staną się starsze, zalecenie, których funkcji C ++ 11 użyć zamiast tych ulepszeń, a które lepiej nie?

użytkownik377178
źródło
4
Boost był jednym z pierwszych, którzy wdrożyli bibliotekę TR1. Ponieważ jest to teraz w standardzie, powinieneś preferować wersję standardową. Boost.Lambda jest teraz w pewnym sensie zastąpiona przez rzeczywiste lambdy.
Kerrek SB
6
Artykuł Wikipedii na temat C ++ 11 zawiera dobre podsumowanie większości zmian.
Jakiś programista koleś

Odpowiedzi:

285

Zastępowane przez funkcje języka C ++ 11 lub biblioteki

TR1 (są zaznaczone w dokumentacji, jeśli są to biblioteki TR1)

Funkcje przeniesione z C ++ 11:

Zastępowane przez funkcje języka C ++ 17:

Standardowy zespół wciąż nad tym pracuje:

Duża część MPL może zostać przycięta lub usunięta przy użyciu różnych szablonów. Niektóre przypadki wspólnego wykorzystywania Lexical obsady może być zastąpione przez std :: to_string i std :: STO X .

Niektóre biblioteki Boost są powiązane z C ++ 11, ale mają również więcej rozszerzeń, np. Boost.Funkcjonalne / Hash zawiera hash_combine i powiązane funkcje nie znalezione w C ++ 11, Boost.Chrono ma I / O i zaokrąglanie i wiele innych zegarów, itp., więc możesz jeszcze rzucić okiem na te wzmacniające, zanim naprawdę je odrzucisz.

kennytm
źródło
1
Dodaj do listy Boost.Chrono , Boost.Exception i Boost.Swap .
ildjarn
9
Zauważ, że Boost.Lambda (a raczej lambda Boost.Phoenix) są nadal przydatne w przypadku polimorficznych lambd.
Xeo
2
Ładna lista, choć nie wierzę, że std::unique_ptrjest częścią TR1 (ponieważ wymaga semantyki przenoszenia)
Nemo
1
@ildjarn: Boost.Chrono zapewnia znacznie więcej funkcji niż <chrono>. Boost.Exception - istotny jest tylko N2179.
kennytm
2
@Nemo: Tak. Tylko std :: tr1 :: shared_ptr jest częścią TR1, a const std :: unique_ptr zastępuje przypadki użycia boost :: scoped_ptr i boost :: scoped_array
kennytm
55

Właściwie nie sądzę, aby biblioteki rozszerzeń stały się dziedzictwem.

Tak, powinieneś być w stanie wykorzystać std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginzamiast Typetraits Boost / Utility, Zwiększ sprytny wskaźnik, Zwiększ krotka, Zwiększ bibliotek klasy, ale nie powinno być w praktyce nie rzeczywista potrzeba „switch”, chyba że jesteś w ruchu więcej twój kod do c ++ 11.

Z mojego doświadczenia stdwynika , że wersje większości z nich są nieco mniej funkcjonalne. Np. AFAICT standard nie ma

  • Wyrażenia regularne Perl5
  • call_traits
  • Niektóre elementy interfejsu wyrażenia regularnego (takie jak bool boost::basic_regex<>::empty()) i inne różnice interfejsu
    • to gryzie więcej, ponieważ interfejs Boost jest dokładnie dopasowany do Boost Xpressive
    • i gra o wiele ładniej z algorytmami łańcucha pomocniczego Oczywiście te ostatnie nie mają standardowych odpowiedników (jeszcze?)
  • Wiele rzeczy związanych z TMP (Boost Fusion)
  • Leniwe lambdas oparte na szablonach wyrażeń; mają nieuniknione zalety, ponieważ mogą być dzisiaj polimorficzne , w przeciwieństwie do C ++ 11. Dlatego często mogą być bardziej zwięzłe:

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);

    Zdecydowanie ma to jeszcze apelację w stosunku do lambd C ++ 11 (z końcowymi typami zwrotów, jawnym przechwytywaniem i deklarowanymi parametrami).

Ponadto funkcja Boost ma WIELKĄ rolę, właśnie w ułatwianiu migracji ścieżek z C ++ 03 do C ++ 11 oraz integrowaniu baz kodów C ++ 11 i C ++ 03. Szczególnie o tym myślę

  • Zwiększ auto (BOOST_AUTO)
  • Narzędzie wspomagające ( boost::result_of<>i powiązane)
  • Boost Foreach (BOOST_FOREACH)
  • Nie zapomnij: Boost Move - pozwala pisać klasy z semantyką move ze składnią, która będzie kompilować się równie dobrze na kompilatorach C ++ 03 z kompilatorami Boost 1_48 + i C ++ 11.

Tylko moje 0,02 $

sehe
źródło