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.
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.
std::stringstream aus dem Header <sstream>.
char* in
einen std::string sind zwei Beispiele dafür. Stellen Sie sicher, daß dafür
keine Stream-Operationen aufgewendet werden.
std::map<K,V> ist z.B. std::map<V,K>.)
std::map
die dazugehörige umgekehrte Map erzeugt.
void f(std::size_t size)
{
char* pch = new char[size];
g(pch);
delete pch;
}