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
– wariantshared_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
- nowy plik nagłówkowy
<random>
–variate_generator
,mersenne_twister
,poisson_distribution
itp. - narzędzia do generowania liczb losowych przy użyciu dowolnego z kilku generatorów liczb pseudolosowych , silników i rozkładów prawdopodobieństwa
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.
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 | 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 | 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
iunordered_multimap
, analogicznie do odpowiednioset
,multiset
,map
imultimap
,- niestety
unordered_set
iunordered_multiset
nie można używać zset_union
,set_intersection
,set_difference
,set_symmetric_difference
izawiera
standardowe funkcje biblioteczne, które praca dlazbioru
iwielozbioru
- niestety
- 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:
- Nici [1]
- Biblioteka Asio C++ (sieci [2] [3] ).
- Sygnały/szczeliny [sigc Propozycja standaryzacji w bibliotece C++ TR2] [4]
- systemu plików Biblioteka systemu plików dla TR2 — oparta na bibliotece systemu plików Boost, do wyszukiwania/manipulacji ścieżkami, plikami i katalogami.
- Wzmocnij dowolną bibliotekę Dowolna propozycja biblioteki dla TR2
- Biblioteka konwersji leksykalnych Propozycja biblioteki konwersji dla TR2
- Nowe algorytmy łańcuchowe Propozycja nowych algorytmów łańcuchowych w TR2
- W kierunku pełniejszej taksonomii właściwości algebraicznych dla bibliotek numerycznych w TR2 ISO/IEC JTC1/SC22/WG21 - Papers 2008
- Dodanie heterogenicznego wyszukiwania porównawczego do kontenerów asocjacyjnych dla TR2 [5]
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ż
- C++11 , standard języka programowania C++; ulepszenia biblioteki były oparte na TR1
- C11 (wersja standardu C) , najnowszy standard języka programowania C
- Biblioteka Boost , duża kolekcja przenośnych bibliotek C++, z których kilka zostało zawartych w TR1
- Standardowa biblioteka szablonów , część bieżącej standardowej biblioteki C++
Źródła
- ISO / IEC JTC1 / SC22 / WG21 — Projekt raportu technicznego dotyczącego rozszerzeń bibliotek C++ (PDF) (raport). 2005-06-24.
- ISO/IEC TR 19768:2007 — Informatyka — Języki programowania — Raport techniczny dotyczący rozszerzeń bibliotek C++ (raport). listopad 2007.
- Becker, Piotr (2006). Rozszerzenia biblioteki standardowej języka C++: samouczek i materiały referencyjne . Addison-Wesley Professional. ISBN 0-321-41299-0 .
Linki zewnętrzne
- Scott Meyers' Effective C++: TR1 Information - zawiera łącza do dokumentów propozycji TR1, które przedstawiają tło i uzasadnienie dla bibliotek TR1.