| Aufgabe | Beschreibung |
|---|---|
| Aufgabe 1 | Bestimmung des Maximums aus einer Folge von ganzen, positiven Zahlen |
| Aufgabe 2 | Konvertierung binärer Zahlen in Dezimalzahlen |
| Aufgabe 3 | Fibonacci-Zahlen |
| Aufgabe 4 | Selektiver Zugriff auf ein Parameter Pack von Datentypen |
Tabelle 1: Aufgaben zur Metaprogrammierung.
Bestimmen Sie die größte Zahl aus einer Folge von ganzen, positiven Zahlen. Die Zahlenfolge selbst stellt das Parameterpack eines Klassentemplates dar. Das Ergebnis soll zur Übersetzungszeit berechnet werden.
Beispiel:
constexpr size_t max2{ Values<8, 6, 4, 10, 3, 5, 7>::MaxNumber };
std::cout << "Max: " << max2 << std::endl;Ausgabe:
Max: 10
Das Binärsystem, auch Dual- oder Zweiersystem genannt, ist ein Zahlensystem, das nur zwei verschiedene
Ziffern – in der Regel 0 und 1 – zur Darstellung von Zahlen kennt. Die Ziffernfolge 1101 zum
Beispiel stellt nicht wie im Dezimalsystem die Tausendeinhunderteins dar, sondern die Dreizehn, denn
im Binärsystem berechnet sich der Wert durch
11012 = 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 1310.
Schreiben Sie eine Funktionsschablone Binary, die den Wert einer ganzen Zahl in Binärdarstellung in
das Dezimalsystem konvertiert.
Beispiele:
constexpr size_t one = Binary<1>::value;
constexpr size_t three = Binary<11>::value;
constexpr size_t five = Binary<101>::value;
constexpr size_t seven = Binary<111>::value;
constexpr size_t nine = Binary<1001>::value;
constexpr size_t big = Binary<1000'0010'0011'0101>::value;Ausgabe:
1
3
5
7
9
33333
Hinweis: Erstellen Sie zunächst eine reguläre C-Funktion, die die gewünschte Umwandlung durchführt und rekursiv implementiert ist! Nun ist es kein weiter Weg mehr, diese C-Funktion in ein C++-Klassentemplate umzuwandeln!
Zusatzaufgabe: In einer einfachen Realisierung werden Sie vermutlich keine Betrachtung von Fehlern
vorgenommen haben. Wie kann man – auf sehr einfache Weise – erreichen,
dass Binary-Instanziierungen der Gestalt
constexpr size_t wrong1 = Binary<2>::value;
constexpr size_t wrong2 = Binary<12345>::value;
vom Übersetzer abgewiesen werden?
In der Mathematik bilden die Fibonacci-Zahlen eine Folge, so dass jede Zahl die Summe der beiden vorhergehenden Zahlen ist, beginnend mit 0 und 1. Für die n.-te Fibonacci Fn bedeutet das Fn = Fn-1 + Fn-2, wobei F0 = 0 und F1 = 1 gelten. Die durch Fibonacci-Zahlen gebildete Sequenz wird als Fibonacci-Sequenz bezeichnet.
Schreiben Sie eine Funktionsschablone Fibonacci, die Fibonacci-Zahlen zur Übersetzungszeit berechnet.
Beispiele:
std::cout << 1 << ": " << Fibonacci<1>::value << std::endl;
std::cout << 2 << ": " << Fibonacci<2>::value << std::endl;
std::cout << 5 << ": " << Fibonacci<5>::value << std::endl;
std::cout << 10 << ": " << Fibonacci<10>::value << std::endl;
std::cout << 15 << ": " << Fibonacci<15>::value << std::endl;
std::cout << 20 << ": " << Fibonacci<20>::value << std::endl;Ausgabe:
1: 1
2: 1
5: 5
10: 55
15: 610
20: 6765
Parameter Packs von Instanzierungen von Templates können eine beliebige Anzahl von Datentypen zusammenfassen, wie zum Beispiel
<int, long, double, char>Schreiben Sie zwei Klassen Templates FirstType und LastType,
die den Zugriff auf den ersten und letzten Datentyp des Parameter Packs ermöglichen:
Beispiel:
using TFirst = FirstType<double, int, long>::type;
using TLast = LastType<int, long, double, char>::type;
TFirst n{ 123.456 };
TLast ch { '!' };