Metaohjelmointia ja muuta hauskaa

Samankaltaiset tiedostot
C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

C++11 lambdat: [](){} Matti Rintala

12 Mallit (Templates)

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

C sekalaista. Roope Hakulinen

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi 2. välikoe HYV5SN

ITKP102 Ohjelmointi 1 (6 op)

Funktiomallit Funktiomallin määrittely

Staattinen metaohjelmointi

Tietueet. Tietueiden määrittely

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

ITKP102 Ohjelmointi 1 (6 op)

Lyhyt kertaus osoittimista

Operaattorin ylikuormitus ja käyttäjän muunnokset

13 Operaattoreiden ylimäärittelyjä

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Tietorakenteet ja algoritmit

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

1. Mitä tehdään ensiksi?

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

Kääntäjän virheilmoituksia

Osoittimet ja taulukot

Tietorakenteet ja algoritmit

812336A C++ -kielen perusteet,

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Metodien tekeminen Javalla

15. Ohjelmoinnin tekniikkaa 15.1

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Delegaatit ja tapahtumakäsittelijät

C-ohjelmointi: Osoittimet

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

C++11 Seminaari Syntaksi part 1. Veli-Pekka Eloranta

Osoittimet ja taulukot

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

Tietorakenteet ja algoritmit

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Vakiokokoiset kokonaislukutyypit

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Javan perusteita. Janne Käki

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

15. Ohjelmoinnin tekniikkaa 15.1

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Osoitin ja viittaus C++:ssa

C# olio-ohjelmointi perusopas

Harjoitus 4 (viikko 47)

TIETORAKENTEET JA ALGORITMIT

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

16. Javan omat luokat 16.1

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Rutiinin muodostaminen. 2. Rutiinin muodostaminen. specification) Määrittely (specification( Määrittelyn osapuolet. Hyvän ohjelman tunnusmerkit

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

14. Poikkeukset 14.1

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

1. Miten tehdään peliin toinen maila?

1. Olio-ohjelmointi 1.1

TIE Ohjelmistojen suunnittelu

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Tietorakenteet ja algoritmit

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Rakenteiset tietotyypit Moniulotteiset taulukot

Luokat. Luokat ja olio-ohjelmointi

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Ohjelmistotekniikan menetelmät, koe

TIE Ohjelmistojen suunnittelu

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Virtuaalifunktiot ja polymorfismi

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Apuja ohjelmointiin» Yleisiä virheitä

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIE Principles of Programming Languages CEYLON

TIE Ohjelmistojen suunnittelu

Transkriptio:

Metaohjelmointia ja muuta hauskaa Juho Lauri C++11-seminaari Kevät 2012

Sisältö 1 Metaohjelmat ja -ohjelmointi 2 Funktiowrapperit ja sitominen 3 std::result of

Metaohjelmat ja -ohjelmointi Ensimmäisiä dokumentoituja kosketuksia metaohjelmointiin Erwin Unruhin metaohjelma standardointikomitean kokouksessa 1994 ohjelma antoi virheilmoituksena alkulukuja Myöhemmin suhtautuminen metaohjelmointiin muuttui vakavammaksi Veldhuizen T., Using C++ template metaprograms, C++ Report Vol. 7 No. 4 (May 1995), pp. 36-43. Nykyään paremmin ymmärretty ja tuettu konsepti Boost: Function.Types, Fusion, MPL, Proto, Static.Assert, Type.Traits,...

Metaohjelmat ja -ohjelmointi Vanhassa C++:ssa tällaisia type traits -luokkia on jo nähty minkä tyyppisiä otuksia Iteraattori-tyyppini käsittelee? std::iterator traits<iteraattori>::value type voiko lukutyyppini X esittää arvon ääretön? std::numeric limits<x>::has infinity Uusi < type traits > tukee metaohjelmointia ja geneeristä ohjelmointia; mahdollista esim. selvittää tyypille päteviä ominaisuuksia (esim. std::is floating point) muokata tyyppejä (esim. std::add const) vertailla tyyppejä (esim. std::is same)

Metaohjelmat ja -ohjelmointi Uutena ominaisuutena myös käännöksenaikainen static assert(lauseke, virheviesti): template <typename T, typename U> void foo(t x, U y) { // Vaaditaan, että T ja U ovat samankokoisia static_assert(sizeof(t) == sizeof(u), "T ja U erikokoisia"); // Vaaditaan, että T ja U ovat samaa tyyppiä static_assert(std::is_same<t,u>::value, "T!= U"); } // Voisiko tyyppiä T kopioida turvallisesti // std::memset-funktiolla? bool opt = std::is_trivially_copyable<t>::value;

Metaohjelmat ja -ohjelmointi yhteenveto C++11 tukee enemmän metaohjelmointia ja geneeristä ohjelmointia uudet avainsanat constexpr ja static assert < type traits >: reilu 100 erilaista traitsia Suurin hyöty (jälleen) lähinnä kirjastojen ym. kehittäjille

Funktiowrapperit ja sitominen Suurehkoja muutoksia ja lisäyksiä < functional > otsikkoon std::function geneerinen, tyyppiturvallinen wrapperi kutsuttaville otuksille std::bind tehokkaampi ja käyttäjäystävällisempi sidonta Vanhat std::bind1st ja std::bind2nd vanhentuneiksi (deprecated)

Funktiowrapperit ja sitominen // Suurin yhteinen tekijä luvuille x ja y int syt(int x, int y) {... } // Palauta int, parametrit: int, int typedef std::function<int (int, int)> fun; fun f = syt; std::cout << f(10, 5) << "\n"; // OK, vapaa funktio fun g = std::plus<int>(); std::cout << g(10, 5) << "\n"; // OK, funktori fun h; h(10, 5); assert(h); //!!, std::bad_function_call // OK, operator bool()

Funktiowrapperit ja sitominen std::bind Uusi std::bind tuottaa funktoreita kutsuttavista otuksista korvaus ja yleistys vanhoille (std::bind1st, std::bind2nd) tekee turhaksi erilaiset adapterit (std::ptr fun, std::mem fun, std::mem fun ref, std::mem fn) Olennainen osa ns. placeholderit (std::placeholders:: n) mahdollistavat argumentit luoduille funktoreille argumentit kopioidaan; syntyvä funktori säilyttää ne sisäisesti

Funktiowrapperit ja sitominen std::bind int kerro(int x, int y) { return x * y; } using std::placeholders::_1; std::function<int, (int)> f = std::bind(kerro, 10, _1); std::cout << f(5); // 10 * 5 == 50 auto g = std::bind(kerro, 10, 5); std::cout << g();

Funktiowrapperit ja sitominen std::bind struct foo { foo() : x_(10) { } void kasva(int y) { x_ *= y; } int x_; }; std::vector<foo> v(10); std::for_each(v.begin(), v.end(), std::bind(&foo::kasva, _1, 10)); // Sama ennen... std::for_each(v.begin(), v.end(), std::bind2nd(std::mem_fun_ref(&foo::kasva), 10));

Funktiowrapperit ja sitominen yhteenveto std::function geneerinen, tyyppiturvallinen wrapperi kutsuttaville otuksille eksplisiittinen vertailu (==,!=) kielletty std::bind tehokkaampi, käyttäjäystävällisempi sidontamekanismi poistaa tarpeen hankalilta adaptereilta

std::result of Metafunktio, joka päättelee funktorikutsun paluutyypin käännösaikana struct foo { double operator()(char, int&); }; int main() { std::result_of<foo(char, int&)>::type f = 3.14; // f on tyyppiä double }