Traits (deutsch Charakterzüge) sind Informationen über Typen. Es gibt sie als
Listing 5 zeigt eine Klasse Vector, die die Anzahl ihrer Elemente und deren Typ in Form von Member Traits veröffentlicht. Diese Technik hat den Vorteil, dass das Lokalitätsprinzip gewahrt ist: Die Definition eines Typs und seine Meta-Information stehen zusammen an einer Stelle. Ist die Meta-Information sehr umfangreich, kann es dem Nutzer des Typs allerdings schwer fallen, Metainformation und Typdefinition klar voneinander zu trennen. Außerdem kann Meta-Information für unterschiedliche Zwecke leicht vermischt werden. Ein gravierender Nachteil ist, dass elementare Typen und solche, deren Quellcode nicht zugänglich ist, nachträglich auf diese Weise nicht mehr um Meta-Information erweiterbar sind.
Eine typische Verwendung von Traits Classes als so genannte Konfigurations-Repositories illustriert Listing 6. Diese minimieren die Schnittstelle zur Parametrisierung von Klassen-Templates und enthalten gleichzeitig die gewünschte Meta-Information. Dadurch, dass die Klasse Vector ein öffentlicher Typalias für ihr Konfigurations-Repository definiert, kann über die Klasse auf ihre Meta-Information zugegriffen werden.
Neben der flexiblen Parametrisierung durch Traits-Klassen und ihrer Verwendung als Konfigurations-Repositories zur statischen Konfiguration lassen sie sich durch den Einsatz von Template-Metaprogrammierung auch berechnen. Sofern Traits-Klassen sehr umfangreich werden, können sie durch geschachtelte Klassen strukturiert werden. Den Nachteil, dass Typdefinition und Meta-Information an verschiedenen Stellen stehen, kompensiert die oben gezeigte Technik, Konfigurations-Repositories zu exportieren.
Das letzte Codebeispiel (Listing 7) zeigt den Einsatz von Traits Templates. Für jede unterschiedliche Implementierung einer Vektorklasse wird das Klassen-Template VectorInfo spezialisiert. Ein Typ einer Vektor-Klasse kann dann in Verbindung mit VectorInfo wie ein Schlüssel genutzt werden, um die vorhandene Metainformation zu erhalten.
Die lose Kopplung von Typdefinition und Metainformation bringt vor allem die Vorteile, dass Metainformation auch nachträglich beispielsweise für elementare Typen bereitgestellt und für unterschiedliche Zwecke sauber getrennt in verschiedenen Template-Klassen und ihren Spezialisierungen untergebracht werden kann. Aufgrund der oben gezeigten unabhängigen Implementierung ist jedoch der Entwickler verantwortlich für die Konsistenz von Typdefinition und Metainformation. Im Gegensatz zu Member Traits stehen bei Traits Templates genauso wie bei Traits Classes Typdefinition und Metainformation an verschiedenen Stellen. Die C++-Standardbibliothek nutzt Traits Templates intensiv, etwa zur Bereitstellung von Metainformationen über numerische Typen (numeric_limits).
Eine ausführliche Darstellung sämtlicher Techniken zur Repräsentation von Metainformationen in C++ enthält der bei Addison-Wesley erschienen Band über generative Programmierung [[default.shtml#literatur 2]] (siehe auch den Online-Artikel von Nathan Myers).
Ulrich W. Eisenecker
Dieser Text ist der Zeitschriften-Ausgabe 09/2001 von iX entnommen.
iOS, Android, Windows Phone 7 und HTML5 - das neue Sonderheft von heise Developer führt Einsteiger und Profis in die Programmierung mobiler Geräte ein.