Koncept (C++)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 22. března 2021; kontroly vyžadují 18 úprav .

Koncept  je rozšířením rozhraní k šablonám jazyka C++ publikovaným v technické specifikaci ISO/IEC ISO TS 19217:2015 [1] . Ve svém jádru je konceptem sada booleovských predikátů umístěných za seznamem parametrů šablony, které jsou vyhodnoceny v době kompilace zdrojového kódu, aby se nastavila omezení vlastností argumentů, které jsou přijímány jako parametry šablony [2] .

Zavedení pojmů je spojeno s dalším vývojem v jazyce C++ nástrojů založených na generickém programovacím paradigmatu [2] . Koncept lze deklarovat pomocí libovolného druhu šablony ( třída šablony , šablona funkce nebo členská funkce šablony), jejím účelem je odhalit logické nesrovnalosti mezi vlastnostmi datových typů, které se používají v těle šablony, a vlastnostmi dat. typy , které přicházejí ve vzoru jako vstupy [2] [3] .

Před jeho zavedením do jazykového standardu byl pojem koncept implementován do obecné knihovny Boost ve formě tříd knihoven BCCL ( Boost Concept Checking Library ) [4] .  

Syntaxe aktuální věty (z C++20)

Definice pojmu.

šablona < classT > _ koncept EqualityComparable ( ) { vyžaduje ( T a , Tb ) { { a == b } -> Boolean ; // Koncept znamenající typ, který se má převést na booleovský { a != b } -> booleovský ; }; }

Šablona, ​​která používá koncept (všimněte si, že neexistuje žádné klíčové slovo šablona).

void f ( const EqualityComparable auto & );

Koncepty se budou podílet na výběru, kterou funkci použít ze sady přetížení, spolu s SFINAE . Kompilátor bude preferovat "nejtěžší" koncept.

Pokud použijete koncept v inicializátoru, bude podobný jako auto, ale kód se zkompiluje, pokud je koncept podporován.

Třídit auto x = f ( y ); // analog auto x = f(y), zkompilovaný, pokud je výsledkem typ vhodný pro Sortable

Pozadí

V generickém programování je koncept  soubor požadavků na typ, aby generický programovací vzor dával smysl. Šablona například předpokládá takové vztahy mezi typy iterátorů It1 a It2. It2 std::copy(It1, It1, It2)

  • It1 a It2 jsou jednosměrné iterátory.
  • Přiřazení je možné mezi typy *It2a .*It1

Tyto koncepty jsou popsány v dokumentaci C++ a jedná se o slovní popis podmínek při kompilaci kódu. Pokud se například pokusíte specializovat šablonu pomocí parametrů , It1=int*, It2=int**kompilátor oznámí, že přiřazení není možné int* ← int. Existují však nevýhody.

  • Chyba vypadne v hlubinách hlavičkového souboru STL - ve složitém známém kódu.
  • Texty chyb jsou často velmi podrobné a je obtížné zjistit, co přesně chybí, aby se šablona specializovala.
  • Když programátor píše šablonu, může omylem opustit koncept a nevšimnout si ho. Neexistuje žádný způsob, jak to zkontrolovat, kromě pokusu o specializaci šablony. Na složitých šablonách není „kontrola specializace“ tak snadná, jak se zdá – většina nejjednodušších typů podporuje spoustu funkcí navíc. Nestačí tedy zkontrolovat std::vector<T>typ int: kromě operací „konstruktor bez parametrů“, „konstruktor přesunu“ a „přiřadit s přesunem“, minimum potřebné pro vektor, má celočíselný typ kopírovací konstruktor, operátor přiřazení, matematické operace a mnoho dalšího a neexistuje žádná záruka, že nejsou používány.

Kromě toho musíte vytvořit funkce, které se objeví nebo zmizí v závislosti na určitých podmínkách (shoda nebo nekonzistence konceptu ). V C++17 jsou šablony pro toto složité.

Dodnes byly pojmy syntakticky popsány jen omezeně - například v Javě hrají roli pojmy příkazy jako class Test <T extends Testable>.

Aktuální stav

Kompilátor Částečně Plně
G++ 6 deset
MSVC 2019 Ještě ne
Zvonit deset Ještě ne

Poznámky

  1. ISO/IEC TS 19217:2015 . ISO (15. listopadu 2015). Získáno 28. dubna 2017. Archivováno z originálu 9. prosince 2016.
  2. 1 2 3 Ostern M. G. Concepts and Modeling // Generic Programming and STL: Using and Extending the C++ Standard Template Library = MH Austern. Generické programování a STL. - Petrohrad: Něvský dialekt, 2004. - S.  32 . — 544 s. - ISBN 5-7940-0119-4 .
  3. Siek J., Lee L.-Q., Lumsdaine A. 2.3 Koncepty a modely // The Boost Graph Library. Uživatelská příručka a referenční příručka . - Addison-Wesley, 2002. - S.  27 . — ISBN 0-201-72914-8 .
  4. Siek J., Lee L.-Q., Lumsdaine A. 2.5 Kontrola konceptu // The Boost Graph Library. Uživatelská příručka a referenční příručka . - Addison-Wesley, 2002. - S.  36 . — ISBN 0-201-72914-8 .