Koncepció (C++)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. március 22-én felülvizsgált verziótól ; az ellenőrzések 18 szerkesztést igényelnek .

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] .  

Az aktuális mondat szintaxisa (C++20-ból)

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ípus

Háttér

Az á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)

  • Az It1 és It2 egyirányú iterátorok.
  • Hozzárendelés típusok *It2és típusok között lehetséges.*It1

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.

  • A hiba az STL fejlécfájl mélyén fog megjelenni - egy összetett, jól ismert kódban.
  • A hibaszövegek gyakran rendkívül bőbeszédűek, és nehéz kitalálni, hogy pontosan mi hiányzik ahhoz, hogy a sablon specializálódjon.
  • Amikor egy programozó sablont ír, előfordulhat, hogy véletlenül elhagyja a koncepciót, és nem veszi észre. Ezt nem lehet másként ellenőrizni, mint a sablon specializálásával. Bonyolult sablonokon a „specializáció ellenőrzése” nem olyan egyszerű, mint amilyennek látszik – a legtöbb legegyszerűbb típus sok extra funkciót támogat. Tehát nem elég std::vector<T>a típust ellenőrizni int: a "paraméter nélküli konstruktor", a "konstruktor mozgatása" és a "költöztetéssel hozzárendelés" műveletek mellett a vektorhoz szükséges minimum, egy egész típusnak van egy másolat konstruktora, egy hozzárendelés operátor, matematikai műveletek és még sok más, és nincs garancia arra, hogy nem használják őket.

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>.

Jelenlegi állapot

Fordítóprogram Részben Teljesen
G++ 6 tíz
MSVC 2019 Még nem
Csengés tíz Még nem

Jegyzetek

  1. ISO/IEC TS 19217:2015 . ISO (2015. november 15.). Letöltve: 2017. április 28. Az eredetiből archiválva : 2016. december 9..
  2. 1 2 3 Ostern M. G. Fogalmak és modellezés // Általános programozás és STL: A C++ szabványos sablonkönyvtár használata és kiterjesztése = MH Austern. Általános programozás és az STL. - Szentpétervár: Nyevszkij dialektus, 2004. -  32. o . — 544 p. - ISBN 5-7940-0119-4 .
  3. Siek J., Lee L.-Q., Lumsdaine A. 2.3 Fogalmak és modellek // The Boost Graph Library. Felhasználói kézikönyv és referencia kézikönyv . - Addison-Wesley, 2002. -  27. o . — ISBN 0-201-72914-8 .
  4. Siek J., Lee L.-Q., Lumsdaine A. 2.5 Concept Checking // The Boost Graph Library. Felhasználói kézikönyv és referencia kézikönyv . - Addison-Wesley, 2002. -  36. o . — ISBN 0-201-72914-8 .