Konceptet är en gränssnittstillägg till C++-språkmallarna publicerade i ISO/IEC ISO TS 19217:2015 [1] teknisk specifikation . I sin kärna är ett koncept en uppsättning booleska predikat placerade bakom en lista med mallparametrar som utvärderas vid källkodens kompileringstid för att sätta begränsningar på egenskaperna hos argumenten som accepteras som mallparametrar [2] .
Införandet av begrepp är förknippat med vidareutvecklingen i C++-språket av verktyg baserade på det generiska programmeringsparadigmet [2] . Ett koncept kan deklareras med vilken typ av mall som helst ( mallklass , funktionsmall eller mallmedlemsfunktion), dess syfte är att upptäcka logiska inkonsekvenser mellan egenskaperna hos datatyper som används i mallens kropp och egenskaperna hos data typer som kommer i mönster som ingångar [2] [3] .
Innan dess introduktion i språkstandarden implementerades idén om ett koncept i Boost - biblioteket för allmänna ändamål i form av BCCL -biblioteksklasser ( Boost Concept Checking Library ) [4] .
Begreppsdefinition.
mall < classT > _ koncept EqualityComparable ( ) { requires ( Ta , T b ) { { a == b } -> Boolean ; // Ett begrepp som betyder en typ som ska konverteras till boolesk { a != b } -> Boolean ; }; }En mall som använder konceptet (observera att det inte finns något mallsökord).
void f ( const EqualityComparable auto & );Koncepten kommer att vara involverade i valet av vilken funktion som ska tillämpas från uppsättningen av överbelastningar, tillsammans med SFINAE . Kompilatorn kommer att föredra det "svåraste" konceptet.
Om du använder konceptet i en initialiserare kommer det att likna auto, men koden kompileras om konceptet stöds.
Sorterbar auto x = f ( y ); // analog av auto x = f(y), kompilerad om resultatet är en typ som lämpar sig för SortableI generisk programmering är ett koncept en uppsättning krav för en typ så att det generiska programmeringsmönstret är vettigt. Till exempel antar mallen sådana relationer mellan iteratortyperna It1 och It2. It2 std::copy(It1, It1, It2)
Dessa begrepp beskrivs i C++-dokumentationen, och de är en verbal beskrivning av villkoren när koden kompileras. Till exempel, om du försöker specialisera en mall med parametrar kommer It1=int*, It2=int**kompilatorn att rapportera att tilldelning inte är möjlig int* ← int. Det finns dock nackdelar.
Dessutom måste du göra funktioner som visas eller försvinner beroende på vissa förhållanden (konformitet eller inkonsekvens av konceptet ). I C++17 är mallar för detta komplicerade.
Än idag har begrepp endast beskrivits syntaktiskt på ett begränsat sätt - till exempel i Java spelas begreppens roll av uttalanden som class Test <T extends Testable>.
Kompilator | Delvis | Fullt |
---|---|---|
G++ | 6 | tio |
MSVC | 2019 | Inte än |
Klang | tio | Inte än |