Konsepti on rajapintalaajennus ISO/IEC ISO TS 19217 :2015 [1] teknisessä eritelmässä julkaistuihin C++-kielimalleihin . Pohjimmiltaan käsite on joukko loogisia predikaatteja , jotka on sijoitettu malliparametriluettelon taakse ja jotka arvioidaan lähdekoodin käännöshetkellä rajoitusten asettamiseksi malliparametreiksi hyväksyttyjen argumenttien ominaisuuksille [2] .
Käsitteiden käyttöönotto liittyy yleiseen ohjelmointiparadigmaan perustuvien työkalujen jatkokehitykseen C++-kielellä [2] . Käsite voidaan ilmoittaa millä tahansa mallipohjalla ( malliluokka , funktiomalli tai mallijäsenfunktio), sen tarkoituksena on havaita loogiset epäjohdonmukaisuudet mallin rungossa käytettävien tietotyyppien ominaisuuksien ja datan ominaisuuksien välillä. tyypit , jotka tulevat kuvioon syötteinä [2] [3] .
Ennen kuin se otettiin käyttöön kielistandardissa , käsite otettiin käyttöön yleiskäyttöisessä Boost - kirjastossa BCCL -kirjastoluokkien ( Boost Concept Checking Library ) muodossa [4] .
Käsitteen määritelmä.
malli < luokkaT > _ käsite EqualityComparable () { vaatii ( T a , T b ) { { a == b } -> Boolen ; // Käsite, joka tarkoittaa tyyppiä, joka muunnetaan loogisiksi { a != b } -> Boolen ; }; }Malli, joka käyttää käsitettä (huomaa, että mallin avainsanaa ei ole).
void f ( const EqualityComparable auto & );Konseptit ovat mukana valittaessa, mitä toimintoa käytetään ylikuormitusjoukosta, samoin kuin SFINAE . Kääntäjä valitsee "vaikeimman" käsitteen.
Jos käytät käsitettä alustuksessa, se on samanlainen kuin auto, mutta koodi käännetään, jos konseptia tuetaan.
Lajiteltava auto x = f ( y ); // auto x = f(y) analogi, käännetty, jos tulos on lajitteluun sopiva tyyppiYleisessä ohjelmoinnissa käsite on joukko vaatimuksia tyypille, jotta yleinen ohjelmointimalli on järkevä. Malli esimerkiksi olettaa tällaisia suhteita iteraattorityyppien It1 ja It2 välillä. It2 std::copy(It1, It1, It2)
Nämä käsitteet on kuvattu C++-dokumentaatiossa, ja ne ovat sanallinen kuvaus olosuhteista, kun koodia käännetään. Jos esimerkiksi yrität erikoisoida mallin parametreilla , It1=int*, It2=int**kääntäjä ilmoittaa, että määrittäminen ei ole mahdollista int* ← int. On kuitenkin haittoja.
Lisäksi sinun on tehtävä toimintoja, jotka ilmestyvät tai katoavat tietyistä ehdoista riippuen ( konseptin yhdenmukaisuus tai epäjohdonmukaisuus ). C++17 :ssä mallit tätä varten ovat monimutkaisia.
Tähän päivään mennessä käsitteitä on kuvattu syntaktisesti vain rajoitetusti - esimerkiksi Javassa käsitteiden roolia ovat lausunnot kuten class Test <T extends Testable>.
Kääntäjä | Osittain | Täysin |
---|---|---|
G++ | 6 | kymmenen |
MSVC | 2019 | Ei vielä |
Kalahtaa | kymmenen | Ei vielä |