C++ teknisk rapport 1
C++ Technical Report 1 ( TR1 ) är det vanliga namnet för ISO/IEC TR 19768, C++ Library Extensions, som är ett dokument som föreslog tillägg till C++ standardbiblioteket för språkstandarden C++03 . Tilläggen inkluderar reguljära uttryck , smarta pekare , hashtabeller och slumptalsgeneratorer . TR1 var inte en standard i sig, utan snarare ett utkast till dokument. De flesta av dess förslag blev dock en del av den senare officiella standarden, C++11 . Innan C++11 standardiserades använde leverantörer detta dokument som en guide för att skapa tillägg. Rapportens mål var "att bygga mer utbredd befintlig praxis för ett utökat C++ standardbibliotek".
Rapporten cirkulerades först i utkastform 2005 som Draft Technical Report on C++ Library Extensions och publicerades sedan 2007 som en ISO/IEC-standard som ISO/IEC TR 19768:2007 .
Översikt
Kompilatorer behövde inte inkludera TR1-komponenterna för att överensstämma med C++-standarden, eftersom TR1-förslag inte var en del av själva standarden, bara en uppsättning möjliga tillägg som fortfarande skulle ratificeras. Men det mesta av TR1 var tillgängligt från Boost , och flera kompilator-/biblioteksdistributörer implementerade alla eller några av komponenterna. TR1 är inte den kompletta listan över tillägg till biblioteket som dök upp i C++11 . Till exempel inkluderar C++11 ett trådstödsbibliotek som inte är tillgängligt i TR1.
De nya komponenterna definierades i namnutrymmet std::tr1
för att skilja dem från det då gällande standardbiblioteket.
Komponenter
TR1 innehåller följande komponenter:
Allmänna verktyg
Referensomslag – gör det möjligt att skicka referenser , snarare än kopior, till algoritmer eller funktionsobjekt. Funktionen baserades på Boost.Ref. En omslagsreferens erhålls från en instans av mallklassen reference_wrapper
. Wrapper-referenser liknar normala referenser ('&') för C++-språket. används mallklassen ref (för en konstant referens
används cref ).
Wrapper-referenser är användbara framför allt för mallfunktioner, när argumentavdrag inte skulle härleda en referens (t.ex. vid vidarebefordran av argument):
0
#include <iostream> #include <tr1/functional> void f ( int & r ) { ++ r ; } mall < class Funct , class Arg > void g ( Funct f , Arg t ) { f ( t ); } int main () { int i = ; g ( f , i ); // 'g< void(int &r), int >' är instansierad std :: cout << i << " \n " ; // Output: 0 g ( f , std :: tr1 :: ref ( i ) ); // 'g< void(int &r), reference_wrapper<int> >' är instansad std :: cout << i << " \n " ; // Utdata: 1 }
Smarta pekare – lägger till flera klasser som förenklar hanteringen av objektlivstid i komplexa fall. Tre huvudklasser läggs till:
-
shared_ptr
– en referensräknad smart pekare -
weak_ptr
– en variant avshared_ptr
som inte ökar referensantalet
Förslaget bygger på Boost Smart Pointer-biblioteket.
Funktionsobjekt
Dessa fyra moduler läggs till i rubrikfilen <functional> :
Polymorphic function wrapper ( function
) – kan lagra vilken funktion som helst (funktionspekare, medlemfunktionspekare och funktionsobjekt) som använder en specificerad funktionsanropssignatur. Typen beror inte på vilken typ av anropsbar som används. Baserat på Boost.Function
Funktionsobjektbindare ( bind
) – kan binda alla parameterparametrar till funktionsobjekt. Funktionssammansättning är också tillåten. Detta är en generaliserad version av standard bindningsfunktionerna std::bind1st
och std::bind2nd .
Funktionen är baserad på Boost Bind-biblioteket.
Funktionsreturtyper ( result_of
) – bestämmer typen av ett anropsuttryck.
Medlemsfunktioner ( mem_fn
) – förbättring av standarden std::mem_fun
och std::mem_fun_ref
. Tillåter att pekare till medlemsfunktioner behandlas som funktionsobjekt. Baserat på Boost Mem Fn-biblioteket.
Metaprogrammering och typegenskaper
Det finns nu <type_traits>
header-fil som innehåller många användbara egenskapsmeta-mallar, såsom is_pod
, has_virtual_destructor
, remove_extent
, etc. Den underlättar metaprogrammering genom att aktivera frågor på och transformation mellan olika typer . Förslaget är baserat på biblioteket Boost Type Traits.
Numeriska faciliteter
Generering av slumptal
- ny
<random>
header-fil –variate_generator
,mersenne_twister
,poisson_distribution
, etc. - verktyg för att generera slumptal med någon av flera pseudoslumptalsgeneratorer, motorer och sannolikhetsfördelningar
Matematiska specialfunktioner
Vissa funktioner i TR1, såsom de matematiska specialfunktionerna och vissa C99-tillägg, ingår inte i Visual C++-implementeringen av TR1. Biblioteket för matematiska specialfunktioner standardiserades inte i C++11.
Dessa funktioner kommer sannolikt att vara av stort intresse för programmerare inom ingenjörs- och vetenskapliga discipliner.
Följande tabell visar alla 23 specialfunktioner som beskrivs i TR1.
Funktionsnamn | Funktionsprototyp | Matematiskt uttryck |
---|---|---|
Associerade Laguerre polynom | dubbel assoc_laguerre (osignerad n, osignerad m, dubbel x); | |
Associerade Legendre polynom | dubbel assoc_legendre (osignerad l, osignerad m, dubbel x); | |
Betafunktion | dubbel beta (dubbel x, dubbel y); | |
Komplett elliptisk integral av det första slaget | dubbel komp_ellint_1 (dubbel k); | |
Komplett elliptisk integral av det andra slaget | dubbel komp_ellint_2 (dubbel k); | |
Komplett elliptisk integral av det tredje slaget | dubbel komp_ellint_3 (dubbel k, dubbel nu); | |
Sammanflytande hypergeometriska funktioner | dubbel conf_hyperg (dubbel a, dubbel c, dubbel x); | |
Regelbundna modifierade cylindriska Bessel-funktioner | dubbel cyl_bessel_i (dubbel nu, dubbel x); | |
Cylindriska Bessel-funktioner av det första slaget | dubbel cyl_bessel_j (dubbel nu, dubbel x); | |
Oregelbundna modifierade cylindriska Bessel-funktioner | dubbel cyl_bessel_k ( dubbel nu, dubbel x ); | |
Cylindriska Neumann-funktioner | dubbel cyl_neumann (dubbel nu, dubbel x); | |
Ofullständig elliptisk integral av det första slaget | dubbel ellint_1 (dubbel k, dubbel phi); | |
Ofullständig elliptisk integral av det andra slaget | dubbel ellint_2 (dubbel k, dubbel phi); | |
Ofullständig elliptisk integral av det tredje slaget | dubbel ellint_3 (dubbel k, dubbel nu, dubbel phi); | |
Exponentiell integral | dubbel expint (dubbel x); | |
Hermitpolynom | dubbel eremit (osignerad n, dubbel x); | |
Hypergeometrisk serie | dubbel hyperg (dubbel a, dubbel b, dubbel c, dubbel x); | |
Laguerre polynom | dubbel laguerre (osignerad n, dubbel x); | |
Legendre polynom | dubbel legendre (osignerad l, dubbel x); | |
Riemann zeta funktion | dubbel riemann_zeta (dubbel x); | |
Sfäriska Bessel-funktioner av det första slaget | dubbel sph_bessel (osignerad n, dubbel x); | |
Sfäriskt associerade Legendre-funktioner | dubbel sph_legendre (osignerad l, osignerad m, dubbel theta); | |
Sfäriska Neumann-funktioner | dubbel sph_neumann (osignerad n, dubbel x); |
Varje funktion har ytterligare två varianter. Att lägga till suffixet ' f ' eller ' l ' till ett funktionsnamn ger en funktion som fungerar på flytande respektive
långa dubbla
värden. Till exempel:
float sph_neumannf ( osignerad n , float x ) ; lång dubbel sph_neumannl ( osignerad n , lång dubbel x ) ;
Behållare
Tuple typer
- ny
<tuple>
-huvudfil –tuple
- baserat på Boost Tuple-biblioteket
- vagt en förlängning av standarden
std::pair
- fast storlek samling av element, som kan vara av olika typer
Array med fast storlek
- ny
<array>
-huvudfil –array
- hämtat från Boost Array-biblioteket
- i motsats till dynamiska arraytyper som standarden
std::vector
Hash tabeller
- nya
<unordered_set>
,< unordered_map >
rubrikfiler - de implementerar klasserna
unordered_set
,unordered_multiset
,unordered_map
ochunordered_multimap
, analogt medset
,multiset
,map
, respektivemultimap ,
- tyvärr kan
unordered_set
ochunordered_multiset
inte användas med standardenset_union
,set_interference
,set_interference
,set_interference
och_ biblioteksfunktioner,som
arbete förset
ochmultiset
- tyvärr kan
- ny implementering, inte härledd från ett befintligt bibliotek, inte helt API-kompatibelt med befintliga bibliotek
- som alla hashtabeller , ger ofta konstant tidsuppslagning av element men i värsta fall kan vara linjär i storleken på behållaren
Vanliga uttryck
- ny
<regex>
-huvudfil –regex
,regex_match
,regex_search
,regex_replace
, etc. - baserat på Boost RegEx-bibliotek
- mönstermatchande bibliotek
C kompatibilitet
C++ är designat för att vara kompatibelt med programmeringsspråket C , men är inte en strikt superset av C på grund av divergerande standarder. TR1 försöker förena några av dessa skillnader genom tillägg till olika rubriker i C++-biblioteket, såsom <complex>, <locale>, <cmath>, etc. Dessa ändringar hjälper till att bringa C++ mer i linje med C99-versionen av C : n standard (inte alla delar av C99 ingår i TR1).
Teknisk rapport 2
2005 gjordes en förfrågan om förslag på en TR2 med särskilt intresse för Unicode, XML/HTML, Nätverk och användbarhet för nybörjare. TR2 inbjudan att lämna förslag .
Några av förslagen inkluderade:
- Trådar [1]
- Asio C++-biblioteket (nätverk [2] [3] ).
- Signaler/Slots [sigc Förslag till standardisering i C++ Library TR2] [4]
- Filsystembibliotek Filsystembibliotek för TR2 – Baserat på Boost Filesystem Library, för sökning/manipulation av sökvägar, filer och kataloger.
- Boosta alla bibliotek Alla biblioteksförslag för TR2
- Lexical Conversion Library Conversion Library Förslag för TR2
- Nya strängalgoritmer Förslag till nya strängalgoritmer i TR2
- Mot en mer komplett taxonomi av algebraiska egenskaper för numeriska bibliotek i TR2 ISO/IEC JTC1/SC22/WG21 - Papers 2008
- Lägger till heterogen jämförelseuppslag till associativa behållare för TR2 [5]
Efter utlysningen av förslag till TR2 ändrades ISO-rutinerna, så det blir ingen TR2. Istället kommer förbättringar av C++ att publiceras i ett antal tekniska specifikationer. Några av förslagen som listas ovan är redan inkluderade i C++-standarden eller i utkastversioner av de tekniska specifikationerna.
Se även
- C++11 , standard för programmeringsspråket C++; biblioteksförbättringarna baserades på TR1
- C11 (C standard revision), den senaste standarden för programmeringsspråket C
- Boost library , en stor samling bärbara C++-bibliotek, av vilka flera inkluderades i TR1
- Standard Template Library , en del av det nuvarande C++ Standard Library
Källor
- ISO/IEC JTC1/SC22/WG21 — Draft Technical Report on C++ Library Extensions ( PDF) (Rapport). 2005-06-24.
- ISO/IEC TR 19768:2007 — Informationsteknologi — Programmeringsspråk — Teknisk rapport om C++ Library Extensions ( Rapport). nov 2007.
- Becker, Peter (2006). C++ Standard Library Extensions: En handledning och referens . Addison-Wesley Professional. ISBN 0-321-41299-0 .
externa länkar
- Scott Meyers effektiva C++: TR1 Information – innehåller länkar till TR1-förslagsdokumenten som ger bakgrund och motivering för TR1-biblioteken.