Raport techniczny C++ 1

C++ Technical Report 1 ( TR1 ) to wspólna nazwa ISO/IEC TR 19768, C++ Library Extensions , który jest dokumentem, który proponuje dodatki do standardowej biblioteki C++ dla standardu języka C++03 . Dodatki obejmują wyrażenia regularne , inteligentne wskaźniki , tablice skrótów i generatory liczb losowych . TR1 nie był sam w sobie standardem, ale raczej projektem dokumentu. Jednak większość jego propozycji stała się częścią późniejszego oficjalnego standardu, C++11 . Zanim C++11 został znormalizowany, dostawcy używali tego dokumentu jako przewodnika przy tworzeniu rozszerzeń. Celem raportu było „zbudowanie bardziej rozpowszechnionej istniejącej praktyki dla rozszerzonej standardowej biblioteki C++”.

Raport został po raz pierwszy rozpowszechniony w formie roboczej w 2005 r. jako Draft Technical Report on C++ Library Extensions , a następnie opublikowany w 2007 r. jako norma ISO/IEC jako ISO/IEC TR 19768:2007 .

Przegląd

Kompilatory nie musiały zawierać komponentów TR1, aby były zgodne ze standardem C++, ponieważ propozycje TR1 nie były częścią samego standardu, a jedynie zestawem możliwych dodatków, które miały jeszcze zostać ratyfikowane. Jednak większość TR1 była dostępna w Boost , a kilku dystrybutorów kompilatorów/bibliotek zaimplementowało wszystkie lub niektóre komponenty. TR1 nie jest pełną listą dodatków do biblioteki, które pojawiły się w C++11 . Na przykład C++11 zawiera bibliotekę obsługi wątków, która nie jest dostępna w TR1.

Nowe komponenty zostały zdefiniowane w przestrzeni nazw std::tr1, aby odróżnić je od ówczesnej biblioteki standardowej.

składniki

TR1 zawiera następujące komponenty:

Narzędzia ogólne

Opakowanie referencyjne – umożliwia przekazywanie referencji zamiast kopii do algorytmów lub obiektów funkcyjnych. Funkcja została oparta na Boost.Ref. Odwołanie do opakowania jest uzyskiwane z instancji klasy szablonu reference_wrapper . Odwołania opakowujące są podobne do zwykłych odniesień („&”) języka C++. Aby uzyskać referencję opakowującą z dowolnego obiektu, używana jest klasa szablonu ref (dla stałej referencji używana jest cref ).

Referencje opakowujące są przydatne przede wszystkim dla funkcji szablonowych, gdy dedukcja argumentów nie wydedukowałaby referencji (np. przy przekazywaniu argumentów):

 
 

        

     
      

  


 

     0

                        
            

         
            
 #include  <iostream>  #include  <tr1/functional>  void  f  (  int  &  r  )  {  ++  r  ;  }  szablon  <  class  Funct  ,  class  Arg  >  void  g  (  Funct  f  ,  Arg  t  )  {  f  (  t  );  }  int  main  ()  {  int  ja  =  ;  g  (  fa  ,  ja  );  // 'g< void(int &r), int >' jest tworzona instancja  std  ::  cout  <<  i  <<  "  \n  "  ;  // Wyjście: 0  g  (  f  ,  std  ::  tr1  ::  ref  (  i  )  );  // 'g< void(int &r), reference_wrapper<int> >' jest instancją  std  ::  cout  <<  i  <<  "  \n  "  ;  // Dane wyjściowe: 1  } 

Inteligentne wskaźniki – dodaje kilka klas, które upraszczają zarządzanie czasem życia obiektów w złożonych przypadkach. Dodano trzy główne klasy:

  • shared_ptr – inteligentny wskaźnik zliczany w referencjach
  • słaby_ptr – wariant shared_ptr , który nie zwiększa liczby referencji

Propozycja oparta jest na bibliotece Boost Smart Pointer.

Obiekty funkcyjne

Te cztery moduły są dodawane do pliku nagłówkowego <functional> :

Opakowanie funkcji polimorficznej ( function ) – może przechowywać dowolną wywoływalną funkcję (wskaźniki funkcji, wskaźniki funkcji składowych i obiekty funkcji), która używa określonej sygnatury wywołania funkcji. Typ nie zależy od rodzaju użytego wywołania. Na podstawie funkcji Boost

Powiązania obiektów funkcji ( bind ) – mogą powiązać dowolne parametry parametrów z obiektami funkcji. Dozwolona jest również kompozycja funkcji. Jest to uogólniona wersja standardowych funkcji wiązania std::bind1st i std::bind2nd . Funkcjonalność bazuje na bibliotece Boost Bind.

Typy zwracane przez funkcję ( result_of ) – określa typ wywołania wyrażenia.

Funkcje składowe ( mem_fn ) – rozszerzenie do standardu std::mem_fun i std::mem_fun_ref . Umożliwia traktowanie wskaźników do funkcji składowych jako obiektów funkcji. Oparta na bibliotece Boost Mem Fn.

Metaprogramowanie i cechy typów

Istnieje teraz plik nagłówkowy <type_traits> , który zawiera wiele przydatnych metaszablonów cech, takich jak is_pod , has_virtual_destructor , remove_extent itp. Ułatwia metaprogramowanie, umożliwiając zapytania i transformacje między różnymi typami . Propozycja oparta jest na bibliotece cech typu wzmocnienia.

Wyposażenie numeryczne

Generowanie liczb losowych

Matematyczne funkcje specjalne

Niektóre funkcje TR1, takie jak matematyczne funkcje specjalne i niektóre dodatki C99, nie są uwzględnione w implementacji TR1 w języku Visual C++. Biblioteka matematycznych funkcji specjalnych nie została ustandaryzowana w C++ 11.

  • dodatki do plików nagłówkowych <cmath> / <math.h> beta , legendre , itp.

Funkcje te będą prawdopodobnie najbardziej interesujące dla programistów z dziedzin inżynierii i nauk ścisłych.

Poniższa tabela przedstawia wszystkie 23 funkcje specjalne opisane w TR1.

Nazwa funkcji Prototyp funkcji Wyrażenie matematyczne
Powiązane wielomiany Laguerre'a podwójne assoc_laguerre (n bez znaku, m bez znaku, podwójne x);
Powiązane wielomiany Legendre'a double assoc_legendre (unsigned l, unsigned m, double x);
Funkcja beta podwójna beta (podwójne x, podwójne y);
Kompletna całka eliptyczna pierwszego rodzaju podwójne comp_ellint_1 (podwójne k);
Kompletna całka eliptyczna drugiego rodzaju podwójne comp_ellint_2 (podwójne k);
Kompletna całka eliptyczna trzeciego rodzaju podwójne comp_ellint_3 (podwójne k, podwójne nu);
Konfluentne funkcje hipergeometryczne podwójne conf_hyperg (podwójne a, podwójne c, podwójne x);
Regularne zmodyfikowane cylindryczne funkcje Bessela podwójne cyl_bessel_i (podwójne nu, podwójne x);
Cylindryczne funkcje Bessela pierwszego rodzaju podwójne cyl_bessel_j (podwójne nu, podwójne x);
Nieregularne zmodyfikowane cylindryczne funkcje Bessela podwójne cyl_bessel_k (podwójne nu, podwójne x);
Cylindryczne funkcje Neumanna

Cylindryczne funkcje Bessela drugiego rodzaju

podwójny cyl_neumann (podwójny nu, podwójny x);
Niezupełna całka eliptyczna pierwszego rodzaju podwójny elint_1 (podwójne k, podwójne fi);
Całka eliptyczna niezupełna drugiego rodzaju podwójny elint_2 (podwójne k, podwójne fi);
Niezupełna całka eliptyczna trzeciego rodzaju podwójne ellint_3 (podwójne k, podwójne nu, podwójne phi);
Całka wykładnicza podwójne exint (podwójne x);
Wielomiany Hermite'a podwójny pustelnik (n bez znaku, podwójny x );
Szeregi hipergeometryczne podwójne hiperg (podwójne a, podwójne b, podwójne c, podwójne x);
Wielomiany Laguerre'a podwójne laguerre (n bez znaku, podwójne x);
Wielomiany Legendre'a podwójna legenda (l bez znaku, podwójne x );
Funkcja zeta Riemanna podwójne riemann_zeta (podwójne x);
Sferyczne funkcje Bessela pierwszego rodzaju podwójne sph_bessel (n bez znaku, podwójne x);
Sferyczne powiązane funkcje Legendre'a double sph_legendre (unsigned l, unsigned m, double theta);
Sferyczne funkcje Neumanna

Sferyczne funkcje Bessela drugiego rodzaju

podwójne sph_neumann (n bez znaku, podwójne x);

Każda funkcja ma dwa dodatkowe warianty. Dodanie sufiksu „ f ” lub „ l ” do nazwy funkcji daje funkcję, która działa odpowiednio na wartościach zmiennoprzecinkowych lub długich podwójnych . Na przykład:

       
          float  sph_neumannf  (  n  bez znaku  ,  float  x  )  ;  długie  podwójne  sph_neumannl  (  n  bez znaku  ,  długie  podwójne  x  )  ; 

Kontenery

Typy krotek

  • nowy plik nagłówkowy <tuple> – Tuple
  • w oparciu o bibliotekę Boost Tuple
  • niejasno rozszerzenie standardowego std::pair
  • zbiór elementów o stałym rozmiarze, który może być różnych typów

Tablica o stałym rozmiarze

  • nowy plik nagłówkowy <array> – array
  • zaczerpnięte z biblioteki Boost Array
  • w przeciwieństwie do dynamicznych typów tablic, takich jak standardowe std::vector

Tabele skrótów

  • nowe <unordered_set> , < unordered_map > pliki nagłówkowe
  • implementują klasy unordered_set , unordered_multiset , unordered_map i unordered_multimap , analogicznie do odpowiednio set , multiset , map i multimap ,
    • niestety unordered_set i unordered_multiset nie można używać z set_union , set_intersection , set_difference , set_symmetric_difference i zawiera standardowe funkcje biblioteczne, które praca dla zbioru i wielozbioru
  • nowa implementacja, nie wywodząca się z istniejącej biblioteki, nie w pełni kompatybilna API z istniejącymi bibliotekami
  • jak wszystkie tablice skrótów , często zapewniają ciągłe wyszukiwanie elementów w czasie, ale w najgorszym przypadku może to być liniowy rozmiar kontenera

Wyrażenia regularne

  • nowy plik nagłówkowy <regex> regex , regex_match , regex_search , regex_replace , itp.
  • w oparciu o bibliotekę Boost RegEx
  • biblioteka dopasowywania wzorców

Kompatybilność C

C++ został zaprojektowany tak, aby był zgodny z językiem programowania C , ale nie jest ścisłym nadzbiorem C ze względu na rozbieżne standardy. TR1 próbuje pogodzić niektóre z tych różnic poprzez dodatki do różnych nagłówków w bibliotece C++, takich jak <complex>, <locale>, <cmath> itp. Te zmiany pomagają dostosować C++ do wersji C99 C standard (nie wszystkie części C99 są zawarte w TR1).

Raport techniczny 2

W 2005 r. wysłano zapytanie ofertowe dotyczące TR2 ze szczególnym uwzględnieniem Unicode, XML/HTML, sieci i użyteczności dla początkujących programistów. TR2 zaproszenie do składania wniosków .

Niektóre z propozycji obejmowały:

Po ogłoszeniu naboru wniosków na TR2 zmieniono procedury ISO, więc TR2 nie będzie. Zamiast tego ulepszenia języka C++ zostaną opublikowane w kilku specyfikacjach technicznych. Niektóre z wymienionych powyżej propozycji są już zawarte w standardzie C++ lub w wersjach roboczych Specyfikacji Technicznych.

Zobacz też

Źródła

Linki zewnętrzne