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 av shared_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

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

Cylindriska Bessel-funktioner av det andra slaget

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

Sfäriska Bessel-funktioner av det andra slaget

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 och unordered_multimap , analogt med set , multiset , map , respektive multimap ,
    • tyvärr kan unordered_set och unordered_multiset inte användas med standarden set_union , set_interference , set_interference , set_interference och_ biblioteksfunktioner, som arbete för set och multiset
  • 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:

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

Källor

externa länkar