Optionale Aufgabe 6

Templates, Generische Programmierung
 

Hinweis: Diese Aufgabe ist optional. Sie müssen Sie nicht vorführen, um diese Veranstaltung zu bestehen und Sie müssen die Fragen nicht beantworten, um 100% der möglichen Punkte erhalten zu können. Sie können aber mit dieser Aufgabe Ihren aktuellen Punktestand verbessern. Dazu müssen Sie mir den Code der Aufgabe vorführen (und natürlich erklären können) und die Fragen beantworten.

Programmieraufgabe

Die mit dem C++-Standard eingeführten Operatoren zur Typumwandlung (static_cast, dynamic_cast, const_cast, reinterpret_cast) bekamen ganz bewußt eine Syntax, die Aufrufen von Funktions-Templates gleicht. Das ermöglicht es, zusätzliche eigene Typumwandlungen zu "erfinden", die sich syntaktisch in das vorhandene Typsystem einfügen. Eine übliche Variante ist die, mittels String-Streams beliebige (Stream-fähige) Typen in einander umzuwandeln.
Schreiben Sie einen solchen "Umwandlungs-Operator" namens stream_cast. Die Syntax sollte folgendes ermöglichen:

    class X;
    std::ostream& operator<<(std::ostream&,const X&);
    std::istream& operator>>(std::istream&,X&);
    
    class Y;
    std::ostream& operator<<(std::ostream&,const Y&);
    std::istream& operator>>(std::istream&,Y&);
    
    void f( const std::string& intstr, const X& x , const Y& y )
    {
      int answer = stream_cast<int>(intstr);
      const std::string& str = stream_cast<std::string>(x);
      const X& xx = stream_cast<X>(str);
      const std::string& str = stream_cast<std::string>(y);
      const Y& yy = stream_cast<Y>(str);
    }

(Hier sind die Klassen X und Y samt den Stream-Operatoren gegeben. Sie sollen den Code in der Funktion f ermöglichen.)
Ich habe Ihnen wieder einen Testtreiber zur Verfügung gestellt. Dieser erwartet, daß Ihr Funktions-Template stream_cast in einem Header stream_cast.h definiert ist.

Bedingungen/Hinweise

Übungsaufgaben

  1. Schreiben Sie eine Metafunktion, die zu einem beliebigen Map-Typen den Typen der dazugehörigen umgekehrten Map erzeugt. (In dieser sind Schlüssel und Werte vertauscht. Die umgekehrte Map zu std::map<K,V> ist z.B. std::map<V,K>.)
  2. Schreiben Sie ein Funktions-Template, welches zu einer beliebigen std::map die dazugehörige umgekehrte Map erzeugt.

Theoretische Fragen

Schauen Sie sich dieses Stück Code an:
    void f(std::size_t size)
    {
      char* pch = new char[size];
      g(pch);
      delete pch;
    }
  1. Dieser Code enthält einen fatalen Fehler. Welcher ist das? Was sind die zu erwartenden Folgen?
  2. Außerdem enthält er noch ein Problem, das zur Laufzeit zum Verlust des allozierten Speichers führen könnte. Erläutern Sie dieses Problem und wie man es vermeiden kann.
  3. Warum gibt es keine teilweise Spezialisierung von Funktions-Templates? Wie kann man sich behelfen, wenn man diese braucht?

Abgabetermin: 16.07.2008