A koncepció az ISO/IEC ISO TS 19217 :2015 [1] műszaki specifikációban közzétett C++ nyelvi sablonok interfészbővítése . A fogalom lényegében logikai predikátumok halmaza, amelyek a sablonparaméterek listája mögött helyezkednek el, és amelyeket a forráskód fordítási idején kiértékelnek, hogy megszorításokat állítsanak be a sablonparaméterként elfogadott argumentumok tulajdonságaira vonatkozóan [2] .
A fogalmak bevezetése az általános programozási paradigmán alapuló eszközök C++ nyelven történő továbbfejlesztéséhez kapcsolódik [2] . Egy fogalom tetszőleges sablonnal deklarálható ( sablonosztály , függvénysablon vagy sablontagfüggvény), célja a sablontörzsben használt adattípusok tulajdonságai és az adatok tulajdonságai közötti logikai inkonzisztenciák észlelése . típusok , amelyek mintában bemenetként jönnek [2] [3] .
A nyelvi szabványba való bevezetése előtt a fogalom fogalmát a Boost általános célú könyvtárban valósították meg BCCL ( Boost Concept Checking Library ) könyvtárosztályok formájában [4] .
Fogalom meghatározása.
sablon < classT > _ koncepció EgyenlőségComparable () { megköveteli ( T a , T b ) { { a == b } -> Logikai ; // Fogalom, amely egy logikai értékre konvertálandó típust jelent { a != b } -> Boolean ; }; }A koncepciót használó sablon (megjegyzendő, hogy nincs sablon kulcsszó).
void f ( const EqualityComparable auto & );A koncepciók részt vesznek majd annak kiválasztásában, hogy melyik függvényt kell alkalmazni a túlterhelések halmazából, valamint a SFINAE . A fordító a "legnehezebb" koncepciót részesíti előnyben.
Ha a koncepciót inicializálóban használja, az hasonló lesz a -hoz auto, de a kód lefordításra kerül, ha a koncepció támogatott.
Rendezhető auto x = f ( y ); // az auto x = f(y) analógja, akkor fordítva, ha az eredmény a Rendezéshez megfelelő típusAz általános programozásban a koncepció egy típusra vonatkozó követelmények halmaza, hogy az általános programozási mintának legyen értelme. Például a sablon ilyen kapcsolatokat feltételez az It1 és It2 iterátortípusok között.It2 std::copy(It1, It1, It2)
Ezeket a fogalmakat a C++ dokumentáció írja le, és szóban leírja a feltételeket a kód összeállítása során. Például, ha megpróbál egy sablont paraméterekkel specializálni , a It1=int*, It2=int**fordító azt jelenti, hogy a hozzárendelés nem lehetséges int* ← int. Vannak azonban hátrányai.
Ezenkívül olyan függvényeket kell létrehoznia, amelyek bizonyos feltételektől függően jelennek meg vagy tűnnek el ( a koncepció konformitása vagy inkonzisztenciája ). A C++17 -ben az ehhez szükséges sablonok bonyolultak.
A fogalmakat a mai napig csak korlátozottan írják le szintaktikailag - például a Java nyelvben a fogalmak szerepét olyan kijelentések töltik be, mint a class Test <T extends Testable>.
Fordítóprogram | Részben | Teljesen |
---|---|---|
G++ | 6 | tíz |
MSVC | 2019 | Még nem |
Csengés | tíz | Még nem |