Concept C - PowerPoint PPT Presentation

About This Presentation
Title:

Concept C

Description:

Negative constraint template class dictionary { // slow, linked-list implementation }; template requires !Hashable – PowerPoint PPT presentation

Number of Views:33
Avg rating:3.0/5.0
Slides: 38
Provided by: asztInfE
Category:

less

Transcript and Presenter's Notes

Title: Concept C


1
Concept C
2
Template-k a jelenlegi szabványban
  • A C template rendszere típus nélküli
  • Nincs nyelvi támogatás a sablon-szerzodés modell
    alkalmazására
  • Az esetleges hibák a példányosítási folyamatban
    túl késon derülnek ki gt
  • Hosszú, bonyolult, nehezen értelmezheto
    hibaüzenetek

3
Példa
  • ...
  • stdlistltintgt intList
  • intList.push_back(42) ... intList.push_back(5)
  • ...
  • stdsort(intList.begin(), intList.end())
  • Ezt gcc-vel fordítva

4
Hibaüzenet
  • /usr/include/c/4.1.3/bits/stl_algo.h In
    function void stdsort(_RandomAccessIterator,
    _RandomAccessIterator) with _RandomAccessIterator
    std_List_iteratorltintgt
  • templ.cpp13 instantiated from here
  • /usr/include/c/4.1.3/bits/stl_algo.h2713
    error no match for operator- in __last -
    __first
  • /usr/include/c/4.1.3/bits/stl_algo.h In
    function void std__final_insertion_sort(_Random
    AccessIterator, _RandomAccessIterator) with
    _RandomAccessIterator std_List_iteratorltintgt
  • /usr/include/c/4.1.3/bits/stl_algo.h2714
    instantiated from void stdsort(_RandomAccessIte
    rator, _RandomAccessIterator) with
    _RandomAccessIterator std_List_iteratorltintgt
  • templ.cpp13 instantiated from here

5
Hibaüzenet folyt.
  • /usr/include/c/4.1.3/bits/stl_algo.h2360
    error no match for operator in __first 16
  • /usr/include/c/4.1.3/bits/stl_algo.h In
    function void std__insertion_sort(_RandomAccess
    Iterator, _RandomAccessIterator) with
    _RandomAccessIterator std_List_iteratorltintgt
  • /usr/include/c/4.1.3/bits/stl_algo.h2363
    instantiated from void std__final_insertion_sor
    t(_RandomAccessIterator, _RandomAccessIterator)
    with _RandomAccessIterator std_List_iteratorlt
    intgt
  • /usr/include/c/4.1.3/bits/stl_algo.h2714
    instantiated from void stdsort(_RandomAccessIte
    rator, _RandomAccessIterator) with
    _RandomAccessIterator std_List_iteratorltintgt
  • templ.cpp13 instantiated from here
  • /usr/include/c/4.1.3/bits/stl_algo.h2273
    error no match for operator in __first 1

6
Hibaüzenet vége
  • /usr/include/c/4.1.3/bits/stl_algo.h2363
    instantiated from void std__final_insertion_sor
    t(_RandomAccessIterator, _RandomAccessIterator)
    with _RandomAccessIterator std_List_iteratorlt
    intgt
  • /usr/include/c/4.1.3/bits/stl_algo.h2714
    instantiated from void stdsort(_RandomAccessIte
    rator, _RandomAccessIterator) with
    _RandomAccessIterator std_List_iteratorltintgt
  • templ.cpp13 instantiated from here
  • /usr/include/c/4.1.3/bits/stl_algo.h2279
    error no match for operator in __i 1

7
A hiba oka
  • Ezt látva joggal gondolhatunk arra, hogy az stl
    implementációban van a hiba
  • Valójában a sort random access iterator-t vár,
    de a list csak forward iteratort szolgáltat
  • Erre azonban csak ez a sor utaltempl.cpp13
    instantiated from here
  • /usr/include/c/4.1.3/bits/stl_algo.h2273
    error no match for operator in __first 1

8
Az új szabány
  • A problémát a C szabványbizottság is látja
  • A következo szabványban bevezetik a concept
    checking fogalmát
  • Lehetové válik a sablon-szerzodés modell nyelvi
    szinten való alkalmazása
  • Cél rövid, értheto hibaüzenetek

9
Az új nyelvi elemek
  • Három új nyelvi konstrukcióval bovül a C
  • Concept
  • A követelmények leírására szolgál
  • Concept_map
  • Szemantikus kapcsolat egy konkrét típus és egy
    konkrét Concept között
  • Requires
  • Megadja, hogy egy adott template függvény vagy
    osztály esetében a template paraméter milyen
    Concept-eknek kell, hogy megfeleljen

10
Concept
  • Olyan típusok és függvényszignatúrák halmaza,
    amelyeket a template függvényünkben vagy
    osztályunkban használni szeretnénk.
  • pl. LessThanComparable concept
  • concept LessThanComparablelttypename Tgt
  • bool operatorlt(T a, T b)

11
Requires
  • A LessThanComparable concept alkalmazása egy
    template algoritmuson
  • templatelttypename Tgt
  • requires LessThanComparableltTgt
  • T min(const T a, const T b)?
  • return a lt b ? a b

12
Requires egyszerubben
  • Ha egy concept csak egy típusra definiál
    megszorításokat (mint ahogy az elobbi példában),
    akkor egyszerubben is definiálhatjuk a template
    függvényünket, osztályunkat
  • templateltLessThanComparable Tgt
  • T min(const T a, const T b)?
  • return a lt b ? a b
  • Azaz a typename kulcsszó helyére közvetlenül
    beírhatjuk a concept nevét.

13
Összetettebb példa a Concept-re
  • concept Regularlttypename Tgt
  • // default constructor
  • T T()
  • // copy constructor
  • T T(const T)
  • // destructor
  • TT()
  • // copy assignment
  • T operator(T, const T)
  • // equality comparison
  • bool operator(const T, const T)
  • // inequality comparison
  • bool operator!(const T, const T)
  • // swap
  • void swap(T, T)

14
Multi-Type Concept
  • Egy concept több típuson is definiálhat
    követelményeket
  • concept Convertiblelttypename T, typename Ugt
  • operator U(const T)
  • Illetve lehet default értéke a típusváltozóknak
  • concept EqualtyComparablelttypename T, typename
    U Tgt
  • bool operator(T, U)?

15
Összetett példa Multi-Type Concept-re
  • concept InputIterator lttypename Iter, typename
    Valuegt
  • Iter Iter ()
    // default constructor
  • Iter Iter (const Iter )
    // copy constructor
  • Iter Iter ()
    // destructor
  • Iter operator(Iter, const Iter)
    // copy assignment
  • Value operator(const Iter)
    // dereference
  • Iter operator(Iter)
    // pre- increment
  • Iter operator(Iter, int)
    // post- increment
  • bool operator(const Iter, const Iter) //
    equality comparison
  • bool operator!(const Iter, const Iter ) //
    inequality comparison
  • void swap(Iter , Iter )
    // swap

16
Concept-ek kompozíciója
  • Lehetoségünk van a korábban definiált
    concept-eket felhasználni újabbak definiálásához
  • Ezáltal az összetett concept-ek definíciója
    egyszerusödik
  • Ennek két módja van
  • beágyazás
  • finomítás

17
Példa a beágyazásra
  • A Regular concept-et felhasználjuk az
    InputIterator concept definiálásakor
  • concept InputIteratorlttypename Iter, typename
    Valuegt
  • requires RegularltItergt
  • Value operator(const Iter) // dereference
  • Iter operator(Iter) // pre-increment
  • Iter operator(Iter, int) // post-increment

18
Példa a finomításra
  • Szintén a Regular concept-et használjuk fel
  • concept InputIteratorlttypename Iter,typename
    Valuegt RegularltValuegt
  • Value operator(const Iter) // dereference
  • Iter operator(Iter) // pre-increment
  • Iter operator(Iter, int) // post-increment
  • Elv Ha van hierarchikus kapcsolat akkor
    finomítás, egyébként beágyazás
  • Különbség concept_map-ek definiálása (késobb)

19
Egy InputIterator-t használó template fv.
  • templatelttypename Iter, Regular Vgt
  • requires InputIteratorltIter, Vgt
  • void print(Iter ?rst, Iter last)?
  • while (?rst ! last)?
  • stdcout ltlt first
  • stdcout ltlt stdendl

20
Az igazi InputIterator concept
  • Valójában az InputIterator a Value típuson kívül
    még definiál egy Reference, egy Pointer és egy
    Difference típust is
  • concept InputIterator
  • lttypename Iter, typename Value, typename
    Reference
  • typename Pointer, typename Di?erencegt
  • requires RegularltItergt
  • requires ConvertibleltReference, Valuegt
  • Reference operator(const Iter) //
    dereference
  • Iter operator(Iter) //
    pre-increment
  • Iter operator(Iter, int) //
    post-increment
  • // ...

21
Egy InputIterator-t használó template fv.
  • Ezeket a template paramétereket mindig fel kell
    sorolni
  • templatelttypename Iter, Regular V, typename R,
  • typename P, typename Dgt
  • requires InputIteratorltIter, V, R, P, Dgt
  • void print(Iter ?rst, Iter last)?
  • while (?rst ! last)?
  • stdcout ltlt first
  • stdcout ltlt stdendl

22
Associated Types
  • Egy kényelmesebb megoldás az ún. Associated
    típusok használata
  • concept InputIteratorlttypename Itergt
  • typename value type
  • typename reference
  • typename pointer
  • typename di?erence type
  • requires RegularltItergt
  • requires Convertibleltreference type, value
    typegt
  • reference operator(const Iter)
  • Iter operator(Iter)
  • Iter operator(Iter, int)
  • // ...

23
Egy InputIterator-t használó template fv.
  • Az elobbi megoldással elértük, hogy csak egy
    argumentuma legyen az InputIterator concept-nek,
    így a megfelelo template fv.-eket is egyszerubben
    definiálhatjuk
  • templateltInputIterator Itergt
  • requires RegularltItervalue typegt
  • void print(Iter ?rst, Iter last)
  • while (?rst ! last)
  • stdcout ltlt first
  • stdcout ltlt stdendl

24
Concept_map
  • Szemantikus kapcsolatot biztosít egy konkrét
    concept és egy konkrét típus között
  • pl. keressük a legrosszabb átlagú diákot
  • struct Diak
  • stdstring name
  • double atlag
  • ...
  • stdlistltDiakgt l
  • ...
  • stdcout ltlt (stdmin_element(l.begin(),
    l.end())).name ltlt stdendl

25
Concept_map 2
  • Ez a program nem fordul le, ugyanis a Diak
    típuson nincs definiálva a lt muvelet.
  • Ezt a concept_map segítségével oly módon meg
    tudjuk oldani, hogy ne kelljen hozzányúlni a Diak
    típushoz
  • concept_map LessThanComparableltDiakgt
  • bool operatorlt(Diak a, Diak b)
  • return a.atlag lt b.atlag

26
Concept_map 3
  • Ha pl. egy X típuson definiált a lt operátor, és
    nem szeretnénk felüldefiniálni, akkor elég az
    alábbi concept_map-et írni
  • concept_map LessThanComparableltXgt
  • Abban az esetben, ha a concept definíciója elé
    odaírjuk az auto kulcsszót, akkor a fenti esetben
    nem kell semmilyen concept_map-et definiálni.

27
További példák Concept_map-re
  • Tfh. az elozoekben az InputIterator conceptet
    auto-nak definiáltuk.
  • Ekkor lehetséges az alábbi részleges concept_map
    definíció
  • concept map InputIteratorltchargt
  • typedef char value type
  • typedef char reference
  • typedef char pointer
  • typedef std ptrdi? t di?erence type
  • A fenmaradó követelményeket (konstruktor,
    destruktor stb. a fordító implicit definiálja

28
További példák Concept_map-re
  • Abban az esetben ha az implicit definíció nem
    helyes definiálhatunk más muködést is
  • pl. int-eket szeretnénk input iterátorként
    használni
  • concept map InputIteratorltintgt
  • typedef int value type
  • typedef int reference
  • typedef int pointer
  • typedef int difference type
  • int operator(int x) return x
  • Ezzel pl. inicializálhatunk konténereket
  • stdcopy(1, 101, v.begin())

29
Concept_map template
  • A concept és a concept_map maguk is lehetnek
    templatek
  • Ugyanis minden pointer (nemcsak a char) egyben
    input iterátor is. Ezt egyszeruen le tudjuk írni
  • templatelttypename Tgt
  • concept_map InputIteratorltTgt
  • typedef T value type
  • typedef T reference
  • typedef T pointer
  • typedef std ptrdi? t di?erence type

30
Példa a container adaptorra
  • A concept, concept_map konstrukciókkal wrapper
    osztályok nélkül meg tudunk valósítani container
    adaptorokat
  • concept Stacklttypename Xgt
  • typename value type
  • void push(X, const value type)
  • void pop(X)
  • value type top(const X)
  • bool empty(const X)

31
És a hozzá tartozó concept_map
  • templatelttypename Tgt
  • concept_map StackltstdvectorltTgt gt
  • typedef T value type
  • void push(stdvectorltTgt v, const T x)
  • v.push_back(x)
  • void pop(std vector ltTgt v)
  • v.pop_back()
  • T top(const stdvector ltTgt v)
  • return v.back()
  • bool empty(const stdvector ltTgt v)
  • return v.empty()

32
Concept-based Overloading
  • Mindig az a template fog példányosulni, ahol az
    aktuális template paraméterek a leginkább
    illeszkednek a concept-hez
  • Ezáltal az stl sok függvényét, mint pl. az
    advance sokkal elegánsabban és egyszerubben
    definiálhatjuk.

33
Az advance fv. definíciói
  • templateltInputIterator Itergt
  • void advance(Iter x, Iterdifference_type n)
  • while (n gt 0) x --n
  • templateltBidirectionalIterator Itergt
  • void advance(Iter x, Iterdifference_type n)
  • if (n gt 0) while (n gt 0) x --n
  • else while (n lt 0) --x n
  • templateltRandomAccessIterator Itergt
  • void advance(Iter x, Iterdifference_type n)
  • x n

34
Negative constraint
  • templateltEqualityComparable Tgt
  • class dictionary
  • // slow, linked-list implementation
  • templateltLessThanComparable Tgt
  • requires !HashableltTgt
  • class dictionaryltTgt
  • // balanced binary tree implementation
  • templateltHashable Tgt
  • class dictionaryltTgt
  • // hash table implementation

35
AOP szimulálása concept-ekkel
  • Tfh. van egy My osztályunk, aminek van egy f és
    egy g függvénye
  • Szeretnénk loggolni valamilyen információt minden
    f és g függvényhívás elott és után
  • Az AOP paradigmát szimulálhatjuk conceptek és
    concept_map-ek segítségével

36
Log concept és concept_map
  • concept Loglttypename Tgt
  • void f()
  • void g()
  • concept_map LogltMygt
  • void f(My m)
  • //log
  • m.f()
  • //log
  • void g(My m)
  • //log
  • m.g()
  • //log

37
A hibaüzenet
  • Az elso példaprogramunkra
  • ...
  • stdlistltintgt intList
  • intList.push_back(42) ... intList.push_back(5)
  • ...
  • stdsort(intList.begin(), intList.end())
  • Az alábbi hibaüzenetet kapjuk
  • listconc.cpp In function int main()
  • listconc.cpp9 error no matching function for
    call to sort(std_List_iteratorltintgt,
    std_List_iteratorltintgt)
  • /home/lupin/local/conceptgcc/bin/../lib/gcc/i686-p
    c-linux-gnu/4.3.0/../../../../include/c/4.3.0/bi
    ts/stl_algo.h2874 note candidates are void
    stdsort(_Iter, _Iter) with _Iter
    std_List_iteratorltintgt ltwhere clausegt
  • listconc.cpp9 note no concept map for
    requirement stdMutableRandomAccessIteratorltstd
    _List_iteratorltintgt gt
Write a Comment
User Comments (0)
About PowerShow.com