Zaawansowane CPP/Ćwiczenia 6: Funkcje typów i inne sztuczki: Różnice pomiędzy wersjami
Linia 1: | Linia 1: | ||
− | |||
− | |||
− | |||
− | |||
'''Zadanie 1 ''' Napisać szablon który sprawdza czy jego parametr | '''Zadanie 1 ''' Napisać szablon który sprawdza czy jego parametr | ||
posiada określony typ stowarzyszony np.: | posiada określony typ stowarzyszony np.: | ||
− | <nowiki> has_value_type<std::vector<int> >::yes | + | <nowiki> has_value_type<std::vector<int> >::yes</nowiki> |
− | </nowiki> | ||
− | powinno mieć wartość <code><nowiki> true</nowiki></code>, a | + | powinno mieć wartość <code><nowiki>true</nowiki></code>, a |
− | <nowiki> has_value_type<int>::yes | + | <nowiki> has_value_type<int>::yes</nowiki> |
− | </nowiki> | ||
− | wartość <code><nowiki> false</nowiki></code>. | + | wartość <code><nowiki>false</nowiki></code>. |
'''Wskazówka ''' Można wzorować się na szablonie <code><nowiki> is_class</nowiki></code>. | '''Wskazówka ''' Można wzorować się na szablonie <code><nowiki> is_class</nowiki></code>. | ||
Linia 21: | Linia 15: | ||
argumentów dziedziczy z drugiego. | argumentów dziedziczy z drugiego. | ||
− | '''Wskazówka ''' Jeśli <code><nowiki> Derived</nowiki></code> dziedziczy z <code><nowiki> Base</nowiki></code> | + | '''Wskazówka ''' Jeśli <code><nowiki>Derived</nowiki></code> dziedziczy z <code><nowiki>Base</nowiki></code> |
− | to typ <code><nowiki> Derived *</nowiki></code> może być konwertowany do <code><nowiki> Base *</nowiki></code>. | + | to typ <code><nowiki>Derived *</nowiki></code> może być konwertowany do <code><nowiki>Base *</nowiki></code>. |
− | Uwaga, każdy typ wskaźnikowy może być konwertowany do <code><nowiki> void *</nowiki></code>. | + | Uwaga, każdy typ wskaźnikowy może być konwertowany do <code><nowiki>void *</nowiki></code>. |
'''Zadanie 3 ''' | '''Zadanie 3 ''' | ||
Linia 29: | Linia 23: | ||
liście typów. Np.: | liście typów. Np.: | ||
− | <nowiki> in<int,TypeList<int,TypeList<double,NullType> >>::yes | + | <nowiki> in<int,TypeList<int,TypeList<double,NullType> >>::yes</nowiki> |
− | </nowiki> | ||
jest prawdziwe, a | jest prawdziwe, a | ||
− | <nowiki> in<int,TypeList<char,TypeList<double,NullType> >>::yes | + | <nowiki> in<int,TypeList<char,TypeList<double,NullType> >>::yes</nowiki> |
− | </nowiki> | ||
jest fałszywe. | jest fałszywe. | ||
Linia 46: | Linia 38: | ||
typ: | typ: | ||
− | <nowiki> struct Empty_type {}; | + | <nowiki> struct Empty_type {};</nowiki> |
− | </nowiki> |
Wersja z 09:26, 3 wrz 2006
Zadanie 1 Napisać szablon który sprawdza czy jego parametr posiada określony typ stowarzyszony np.:
has_value_type<std::vector<int> >::yes
powinno mieć wartość true
, a
has_value_type<int>::yes
wartość false
.
Wskazówka Można wzorować się na szablonie is_class
.
Zadanie 2 Napisać szablon który sprawdza czy jeden z jego argumentów dziedziczy z drugiego.
Wskazówka Jeśli Derived
dziedziczy z Base
to typ Derived *
może być konwertowany do Base *
.
Uwaga, każdy typ wskaźnikowy może być konwertowany do void *
.
Zadanie 3 Napisać szablon który sprawdza czy dany typ jest wymieniony w podanej liście typów. Np.:
in<int,TypeList<int,TypeList<double,NullType> >>::yes
jest prawdziwe, a
in<int,TypeList<char,TypeList<double,NullType> >>::yes
jest fałszywe.
Zadanie 4
Implementacja indeksowania listy typów podana na wykładzie, w przypadku przekroczenia zakresu powuduje bład kompilacji. Napisać mniej restrykcyjna wersję tego szablonu, która w takiej sytacji "zwraca" typ:
struct Empty_type {};