Kombiniert man das nun noch mit Vererbung und der Operatorüberladung, so sind templates insbesondere für die Bibliotheks-Entwicklung von sehr großem Nutzen, wie u.a. das Beispiel der C++ Standard Template Library (STL) zeigt.
Das templates die Typen, auf die sie operieren sollen, nicht vorab kennen, ist unter gewissen Umständen auch ein Nachteil. Ein Problem ist beispielsweise, das die von einem template zur Verfügung gestellten Algorithmen für einen unbekannten Typ A vielleicht sehr gut passen und auch performant sein mögen, hingegen selbige für einen Typ B gänzlich ungeeignet sind. Hilfreich wäre also ein Idiom, welches einem template in Abhängigkeit vom für einen Templateparameter eingesetzten konkreten Typ gewisse Informationen bereitstellt, damit der Compiler entscheiden kann, wie damit umzugehen ist bzw. um einen Compilerfehler zu erzeugen, wenn der eingesetzte Typ sogar gänzlich ungeeignet für das template ist. An dieser Stelle kommen die traits ins Spiel...
“Think of a trait as a small object whose main purpose is to carry information used by another object or algorithm to determine ‘policy’ or ‘implementation details’.” - Bjarne Stroustrup
Type traits (traits = dt.: Charakterzüge, Wesenszüge, Merkmale) sind quasi Meta-Informationen über Typen. Es handelt sich um eine Technik, um:
- Informationen und Eigenschaften zu Typen bereit zustellen.
- Operationen für bestimmte Typen zu abstrahieren.
- Entscheidungen basierend auf Typen zur Compilezeit zu treffen.
Hier ein einfaches Beispiel für Traits:
Das Basis Traits-Template is_int enthält eine boolsche Konstante value, diese ist per default false. Anschließend folgen eine Reihe von Spezialisierungen dieses Templates für diverse Integer-Typen; in diesen Fällen wird die Konstante value auf true gesetzt. Die Template-Funktion do_something benutzt nun is_int, um eine Fallentscheidung durchzuführen: ist der Template-Parameter T ein Integer-Typ, so ist is_int::value true, ansonsten false.
Folgendes, kleines Test-Programm...
...erzeugt auf der Konsole folgende Ausgaben:
D:\Stephan\Development\Visual Studio 2008\Projects\Traits\Debug>traits Specialized algorithm for integer types. Algorithm for non-integer types.
In der STL werden Traits sehr häufig eingesetzt, ein Beispiel sind die Iterator-Traits (siehe http://www.sgi.com/tech/stl/iterator_traits.html).




