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] .
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 SortableV 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)
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.
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>.
Kompilátor | Částečně | Plně |
---|---|---|
G++ | 6 | deset |
MSVC | 2019 | Ještě ne |
Zvonit | deset | Ještě ne |