Conceptul este o extensie a interfeței la șabloanele de limbaj C++ publicate în specificația tehnică ISO/IEC ISO TS 19217:2015 [1] . În esență , un concept este un set de predicate booleene plasate în spatele unei liste de parametri șablon care sunt evaluați la momentul compilarii codului sursă pentru a stabili constrângeri asupra proprietăților argumentelor care sunt acceptate ca parametri șablon [2] .
Introducerea conceptelor este asociată cu dezvoltarea ulterioară în limbajul C++ a instrumentelor bazate pe paradigma de programare generică [2] . Un concept poate fi declarat cu orice tip de șablon ( clasă șablon, șablon de funcție sau funcție membru șablon), scopul său este de a detecta inconsecvențele logice între proprietățile tipurilor de date care sunt utilizate în corpul șablonului și proprietățile datelor. tipuri care vin în model ca intrări [2] [3] .
Înainte de introducerea sa în standardul limbajului, noțiunea de concept a fost implementată în biblioteca de uz general Boost sub forma claselor de bibliotecă BCCL ( Boost Concept Checking Library ) [4] .
Definirea conceptului.
șablon < classT > _ concept EqualityComparable () { necesită ( T a , T b ) { { a == b } -> Boolean ; // Un concept care înseamnă un tip de convertit în boolean { a != b } -> Boolean ; }; }Un șablon care utilizează conceptul (rețineți că nu există un șablon cheie).
void f ( const EqualityComparable auto & );Conceptele vor fi implicate în alegerea funcției de aplicat din setul de supraîncărcări, alături de SFINAE . Compilatorul va prefera conceptul „cel mai greu”.
Dacă utilizați conceptul într-un inițializator, acesta va fi similar cu auto, dar codul se va compila dacă conceptul este acceptat.
Sortable auto x = f ( y ); // analog al auto x = f(y), compilat dacă rezultatul este un tip potrivit pentru SortableÎn programarea generică, un concept este un set de cerințe pentru un tip, astfel încât modelul de programare generic să aibă sens. De exemplu, șablonul presupune astfel de relații între tipurile de iterator It1 și It2. It2 std::copy(It1, It1, It2)
Aceste concepte sunt descrise în documentația C++ și sunt o descriere verbală a condițiilor când codul este compilat. De exemplu, dacă încercați să specializați un șablon cu parametri , It1=int*, It2=int**compilatorul va raporta că atribuirea nu este posibilă int* ← int. Cu toate acestea, există dezavantaje.
În plus, trebuie să realizați funcții care apar sau dispar în funcție de unele condiții (conformitatea sau inconsecvența conceptului ). În C++17 , șabloanele pentru aceasta sunt complicate.
Până în prezent, conceptele au fost descrise sintactic doar într-un mod limitat - de exemplu, în Java , rolul conceptelor este jucat de instrucțiuni precum class Test <T extends Testable>.
Compilator | Parţial | In totalitate |
---|---|---|
G++ | 6 | zece |
MSVC | 2019 | Nu încă |
Zăngăni | zece | Nu încă |