Konsepti (C++)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 22. maaliskuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 18 muokkausta .

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

Nykyisen lauseen syntaksi (C++20:sta)

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 tyyppi

Tausta

Yleisessä 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)

  • It1 ja It2 ovat yksisuuntaisia ​​iteraattoreita.
  • Kohdistus on mahdollista tyyppien *It2ja välillä.*It1

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.

  • Virhe putoaa STL-otsikkotiedoston syvyyteen - monimutkaisessa, tiedossa olevan oikea koodissa.
  • Usein virhetekstit ovat äärimmäisen monisanaisia, ja on vaikea hahmottaa, mitä tarkalleen puuttuu, jotta malli erikoistuisi.
  • Kun ohjelmoija kirjoittaa mallin, hän saattaa vahingossa jättää käsitteen huomaamatta sitä. Tätä ei voi tarkistaa millään muulla kuin yrittämällä erikoistua malliin. Monimutkaisissa malleissa "erikoistumisen tarkistus" ei ole niin helppoa kuin miltä näyttää - useimmat yksinkertaisimmat tyypit tukevat monia lisäominaisuuksia. std::vector<T>Eli tyypin tarkistaminen ei riitä int: operaatioiden "konstruktori ilman parametreja", "siirrä konstruktori" ja "määritä siirrolla" lisäksi vektorille vaadittava vähimmäismäärä, kokonaislukutyypissä on kopiokonstruktori, määritysoperaattori, matemaattiset operaatiot ja paljon muuta, eikä ole takeita siitä, että niitä ei käytetä.

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

Nykyinen tila

Kääntäjä Osittain Täysin
G++ 6 kymmenen
MSVC 2019 Ei vielä
Kalahtaa kymmenen Ei vielä

Muistiinpanot

  1. ISO/IEC TS 19217:2015 . ISO (15. marraskuuta 2015). Haettu 28. huhtikuuta 2017. Arkistoitu alkuperäisestä 9. joulukuuta 2016.
  2. 1 2 3 Ostern M. G. Käsitteet ja mallintaminen // Yleinen ohjelmointi ja STL: C++-standardimallikirjaston käyttö ja laajentaminen = MH Austern. Yleinen ohjelmointi ja STL. - Pietari: Nevskin murre, 2004. - S.  32 . — 544 s. - ISBN 5-7940-0119-4 .
  3. Siek J., Lee L.-Q., Lumsdaine A. 2.3 Käsitteet ja mallit // The Boost Graph Library. Käyttöopas ja viiteopas . - Addison-Wesley, 2002. - s  . 27 . — ISBN 0-201-72914-8 .
  4. Siek J., Lee L.-Q., Lumsdaine A. 2.5 Concept Checking // Boost Graph Library. Käyttöopas ja viiteopas . - Addison-Wesley, 2002. - s  . 36 . — ISBN 0-201-72914-8 .