Koncept (C++)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 22. marts 2021; checks kræver 18 redigeringer .

Konceptet  er en grænsefladeudvidelse til C++ sprogskabelonerne udgivet i ISO/IEC ISO TS 19217:2015 [1] tekniske specifikationer . I sin kerne er et koncept et sæt booleske prædikater , der er placeret bag en liste over skabelonparametre, der evalueres ved kildekodekompileringstidspunktet for at sætte begrænsninger på egenskaberne af de argumenter, der accepteres som skabelonparametre [2] .

Introduktionen af ​​begreber er forbundet med den videre udvikling i C++ sproget af værktøjer baseret på det generiske programmeringsparadigme [2] . Et koncept kan erklæres med enhver form for skabelon ( skabelonklasse , funktionsskabelon eller skabelonmedlemsfunktion), dets formål er at detektere logiske uoverensstemmelser mellem egenskaberne af datatyper, der bruges i skabelonens krop og egenskaberne af data typer , der kommer i mønster som input [2] [3] .

Forud for dets introduktion i sprogstandarden, blev begrebet et koncept implementeret i Boosts generelle bibliotek i form af BCCL ( Boost Concept Checking Library ) biblioteksklasser [4] .  

Syntaks for den aktuelle sætning (fra C++20)

Begrebsdefinition.

skabelon < classT > _ koncept EqualityComparable ( ) { requires ( Ta , T b ) { { a == b } -> Boolean ; // Et begreb, der betyder en type, der skal konverteres til boolesk { a != b } -> Boolean ; }; }

En skabelon, der bruger konceptet (bemærk, at der ikke er noget skabelonnøgleord).

void f ( const EqualityComparable auto & );

Koncepterne vil være involveret i valget af, hvilken funktion der skal anvendes fra sættet af overbelastninger, sammen med SFINAE . Compileren vil foretrække det "sværeste" koncept.

Hvis du bruger konceptet i en initializer, vil det ligne auto, men koden vil kompilere, hvis konceptet er understøttet.

Sorterbar auto x = f ( y ); // analog af auto x = f(y), kompileret hvis resultatet er en type egnet til Sortable

Baggrund

I generisk programmering er et koncept  et sæt krav til en type, så det generiske programmeringsmønster giver mening. For eksempel antager skabelonen sådanne relationer mellem iteratortyperne It1 og It2. It2 std::copy(It1, It1, It2)

  • It1 og It2 er envejs iteratorer.
  • Tildeling er mulig mellem typer *It2og .*It1

Disse begreber er beskrevet i C++-dokumentationen, og de er en verbal beskrivelse af forholdene, når koden kompileres. For eksempel, hvis du forsøger at specialisere en skabelon med parametre , vil It1=int*, It2=int**compileren rapportere, at tildeling ikke er mulig int* ← int. Der er dog ulemper.

  • Fejlen vil falde ud i dybden af ​​STL-header-filen - i en kompleks, der vides at være korrekt kode.
  • Ofte er fejlteksterne ekstremt ordrette, og det er svært at finde ud af, hvad der præcist mangler, for at skabelonen kan specialisere sig.
  • Når en programmør skriver en skabelon, kan han ved et uheld forlade konceptet og ikke bemærke det. Der er ingen måde at kontrollere dette på, undtagen ved at forsøge at specialisere skabelonen. På komplekse skabeloner er "specialiseringskontrol" ikke så let, som det ser ud til - de fleste af de enkleste typer understøtter en masse ekstra funktioner. Så det er ikke nok at kontrollere std::vector<T>typen int: ud over operationerne "konstruktør uden parametre", "flyt konstruktør" og "tildel med flyt", det minimum, der kræves for en vektor, har en heltalstype en kopikonstruktør, en opgaveoperatør, matematiske operationer og meget mere, og der er ingen garantier for, at de ikke bliver brugt.

Derudover skal du lave funktioner, der vises eller forsvinder afhængigt af nogle forhold (konformitet eller inkonsistens i konceptet ). I C++17 er skabeloner til dette komplicerede.

Den dag i dag er begreber kun blevet syntaktisk beskrevet på en begrænset måde - for eksempel i Java spilles begrebernes rolle af udsagn som class Test <T extends Testable>.

Nuværende tilstand

Kompiler Delvist Fuldt ud
G++ 6 ti
MSVC 2019 Ikke endnu
Clang ti Ikke endnu

Noter

  1. ISO/IEC TS 19217:2015 . ISO (15. november 2015). Hentet 28. april 2017. Arkiveret fra originalen 9. december 2016.
  2. 1 2 3 Ostern M. G. Koncepter og modellering // Generisk programmering og STL: Brug og udvidelse af C++ Standard Template Library = MH Austern. Generisk programmering og STL. - St. Petersborg: Nevsky Dialect, 2004. - S.  32 . — 544 s. - ISBN 5-7940-0119-4 .
  3. Siek J., Lee L.-Q., Lumsdaine A. 2.3 Koncepter og modeller // The Boost Graph Library. Brugervejledning og referencemanual . - Addison-Wesley, 2002. - S.  27 . — ISBN 0-201-72914-8 .
  4. Siek J., Lee L.-Q., Lumsdaine A. 2.5 Concept Checking // The Boost Graph Library. Brugervejledning og referencemanual . - Addison-Wesley, 2002. - S.  36 . — ISBN 0-201-72914-8 .