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] .
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 SortableI 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)
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.
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>.
Kompiler | Delvist | Fuldt ud |
---|---|---|
G++ | 6 | ti |
MSVC | 2019 | Ikke endnu |
Clang | ti | Ikke endnu |