Zaawansowane CPP/Ćwiczenia 6: Funkcje typów i inne sztuczki: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
Linia 1: Linia 1:
''Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi� poprawki''
 
 
{Funkcje typów i inne sztuczki}
 
 
 
'''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 {};