Osittainen mallin erikoistuminen

Osittainen mallien erikoistuminen  on C++- ohjelmointikielen mekanismi, joka on suunniteltu erikoistamaan yleiset malliluokat tiettyihin tehtäviin tai niiden parametroitujen tietotyyppien tietylle osajoukolle [1] . Amerikkalaisen tiedemiehen ja C ++:n luojan mukaan B. Stroustrupmallien erikoistuminen on tehokas tapa estää koodivolyymien hallitsematon kasvu käytettäessä malliluokan työkalupakkia aktiivisesti, myös keskikokoisia ohjelmistoprojekteja kehitettäessä. Tämä johtuu siitä, että se ei salli redundanttien koodikopioiden luomista kullekin tietylle tietotyypille, niiden korvaamista yleisemmillä koodinpätkillä ja lisäksi lopputuotteen käännös- ja linkitysajan lyhentämistä [2] .

Nimenomainen täysi erikoistuminen

C++:ssa parametroidun tietotyypin (mallin) eksplisiittinen erikoistuminen suoritetaan luomalla lisämalliluokka, jossa ensisijaisen luokan syöttöparametrit määritetään kokonaan tai osittain uudelleen tietyillä tietotyypeillä [1] [3] .

Tällaisen ohituksen syntaksi on seuraava [4] :

malli < lista malliluokan syöttöparametreista > _ _ _ luokka | rakenne | liiton luokan_nimi < malliluokan argumenttiluettelo > _ _ _ _

Esimerkiksi [1] :

// ensisijainen luokkamalli < typename Window , typename Controller > class Widget { /* ... parametroidun Widget-luokan toteutus mille tahansa ikkunalle ja mille tahansa Controller-tapahtumakäsittelijälle */ }; // perusluokan mallin eksplisiittinen erikoistuminen <> luokan widget < DialogWindow , DialogController > { /* ... Widget-luokan toteutus DialogWindow-valintaikkunan ja DialogController-valintaikkunan tapahtumakäsittelijän kanssa työskentelemistä varten */ };

On huomattava, että perusluokan sisältämiä tietotyyppimääritelmiä ei koskaan käytetä sen osittaisen erikoistumisen jäsenten ilmentämiseen. Alkuluokan erikoisversioiden kooditoteutuksella ei kuitenkaan ole mitään tekemistä sen kanssa, ja se voi sisältää joukon jäseniä, joilla ei ole mitään tekemistä ensisijaisen luokan jäsenten kanssa [4] .

Koodin generointivaiheessa kääntäjä, etsiessään sopivaa mallipohjaa, tilaa osittain käytettävissään olevat perusluokan erikoistumisvaihtoehdot ja valitsee niistä sopivimman. Jos sellaista ei ole, kääntäjä tuottaa virheilmoituksen [4] .

Osittainen erikoistuminen

Luokkamallipohjan osittainen erikoistuminen määritellään ensisijaisen luokan parametrien konfiguraatioksi, joka toimii argumenttina erikoistuneelle toteutukselle. Esimerkki tällaisesta erikoistumisesta on mikä tahansa konttiluokka , joka on toteutettu tallentamaan osoitinobjekteja [2] [5] :

// perusluokan malli < tyypinnimi T > luokan vektori { /* ... konttiluokan toteutus T-tyypin objekteille... */ }; // Ensisijaisen luokan osittainen erikoistuminen osoittimien malliin < typename T > luokan vektori < T *> { /* ... konttiluokan toteutus osoittimille tyyppiä T... */ };

Tässä tapauksessa malliparametrin argumentti ei ole lauseke, joka välitetään malliin argumenttina, vaan se johdetaan argumenttikonstruktista, joka perustuu ilmoitettuun ensisijainen luokkamalliin [2] .

Parametrisoidun malliluokan yksittäisten menetelmien osittaista erikoistumista ei sallita [1] , eikä osittaista erikoistumista ole sallittua käyttää oletusparametreja [5] .

Esimerkki

Osittaisen mallin erikoistumisen joustavan käytön ansiosta voit suorittaa tehokkaasti joitain ei-triviaaleja laskutoimituksia. Esimerkiksi melko yksinkertainen luokkien kokoonpano voi auttaa laskemaan moniulotteisen taulukon rakennetta (dimensioiden lukumäärää), jossa on aiemmin tuntemattoman tyyppisiä elementtejä [5] :

// ensisijainen luokkamalli < luokka T > struct RankOfArray { static const int arvo = 0 ; }; // toistuva osittain erikoistunut luokkamalli < luokka T , int N > struct RankOfArray < T [ N ] > { staattinen const int arvo = 1 + RankOfArray < T > :: arvo ; };

Katso myös

Muistiinpanot

  1. 1 2 3 4 Alexandrescu A. 2.2 Osittainen mallin erikoistuminen // Moderni C++-suunnittelu: yleisiä ohjelmointi- ja suunnittelumalleja sovellettu. - Addison Wesley, 2001. - S. 22-23. — 352 s. - ISBN 0-201-70431-5 .
  2. 1 2 3 Stroustrup B. 25.3 Erikoistuminen // C++-ohjelmointikieli. – 4. painos. - Addison-Wesley, 2013. - S. 730. - ISBN 978-0-321-56384-2 .
  3. Baumann R. 3.1 Eksplisiittinen erikoistuminen // syvällinen pohdiskelu C++-mallimekanismista. - Zürich: Swiss Federal Institute of Technology ETH, 2002. - S. 10.
  4. 1 2 3 Pobegailo A.P. 19.5 Luokkamallipohjan osittainen erikoistuminen // C/C++ opiskelijoille. - BHV-Petersburg, 2006. - S. 265. - 528 s. — (tietokoneet). — ISBN 5-94157-647-1 .
  5. 1 2 3 Baumann R. 3.2 Luokkamallin osittainen erikoistuminen // Syvällinen pohdiskelu C++-mallin mekanismista. - Zürich: Swiss Federal Institute of Technology ETH, 2002. - S. 13.

Linkit