C++-Template

C++-Template
QS-Informatik

Dieser Artikel wurde aufgrund von inhaltlichen Mängeln auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf mit, die inhaltlichen Mängel dieses Artikels zu beseitigen und beteilige dich an der Diskussion! (+)
Begründung: Templates oder Schablonen ist nichts C++ spezifisches, das gab es bereits in VB und gibt es auch in c# und bestimmt in einigen anderen Sprachen. Der Artikel sollte dies allgemein Darstellen. --Stanze 14:45, 19. Mär. 2009 (CET)

Templates (engl.: Schablonen) sind „Programmgerüste“, die eine vom Datentyp unabhängige Programmierung ermöglichen. Templates unterstützen die generische Programmierung.

In C++ sind Templates von großem Nutzen, insbesondere wenn sie mit Vererbung und Überladen von Operatoren kombiniert werden. Auch die C++-Standardbibliothek stellt viele nützliche Komponenten in Form eines Template-Frameworks, zur Verfügung.

In anderen Programmiersprachen gibt es ein zu Templates ähnliches Konzept unter dem Namen „generischer Typ“.

Inhaltsverzeichnis

Arten von Templates

Es gibt zwei Arten von Templates in C++: Funktionstemplates und Klassentemplates.

Funktionstemplates

Ein Funktionstemplate (auch Templatefunktion genannt) verhält sich wie eine Funktion, die in der Lage ist, Argumente verschiedener Typen entgegenzunehmen, und/oder verschiedene Rückgabetypen zu liefern. Die C++-Standardbibliothek enthält beispielsweise das Funktionstemplate std::max(x, y). Es gibt entweder x oder y zurück, und zwar abhängig davon, welches der beiden Argumente größer ist. Es könnte etwa folgendermaßen definiert sein:

template < typename T >
T max(T x, T y)
{
  if (x < y)
    return y;
  else
    return x;
}

Dieses Template kann genauso aufgerufen werden wie eine Funktion:

cout << max(3, 7);   // gibt 7 aus

Anhand der Argumente macht der Compiler fest, dass es sich um einen Aufruf an max(int, int) handelt und erzeugt eine Variante der Funktion, bei der der Typ T zu int festgelegt wird.

Der Templateparameter könnte auch explizit angegeben werden:

cout << max<int>(3, 7); // gibt ebenfalls 7 aus

Das Funktionstemplate max() lässt sich für jeden Typ instanziieren, für den der Vergleich x < y eine wohldefinierte Operation darstellt. Bei selbstdefinierten Typen macht man von Operator-Überladung Gebrauch, um die Bedeutung von < für den Typ festzulegen und dadurch die Verwendung von max() für den betreffenden Typ zu ermöglichen.

Der C++-Sprachstandard formuliert die Anforderungen an Datentypen und ihre Operatoren für die Verwendung mit als Funktionstemplate definierten Standardalgorithmen. Im Zusammenspiel mit der C++-Standardbibliothek erschließt sich eine enorme Funktionalität für einen selbstdefinierten Typ durch die Definition einiger Operatoren. Allein schon durch die Definition eines eine strenge schwache Ordnung realisierenden Vergleichsoperators < werden die Standardalgorithmen std::sort(), std::stable_sort(), und std::binary_search() für den Typ anwendbar. Ein solcher Operator erlaubt auch die Verwendung des Typs als Element von als Klassentemplate definierten Datenstrukturen wie Mengen und assoziativen Feldern.

Klassentemplates

Ein Klassentemplate (auch fälschlich Templateklasse genannt) wendet das gleiche Prinzip auf Klassen an. Klassentemplates werden oft zur Erstellung von generischen Containern verwendet. Beispielsweise verfügt die C++-Standardbibliothek über einen Container, der eine verkettete Liste implementiert. Um eine verkettete Liste von int zu erstellen, schreibt man einfach list<int>. Eine verkettete Liste von Objekten des Datentypes string wird zu list<string>. Mit list ist ein Satz von Standardfunktionen definiert, die immer verfügbar sind, egal was man als Argumenttyp in den spitzen Klammern angibt. Die Werte in spitzen Klammern werden Parameter genannt. Wenn ein Klassentemplate mit seinen Parametern dem Compiler übergeben wird, so kann dieser das Template ausprägen. Er erzeugt hierbei zu jedem Parametertyp eine eigene Templateklasse. Diese ist eine gewöhnliche Klasse, wie jede andere auch. Die Begriffe Klassentemplate und Templateklasse sind hier von einander zu unterscheiden. Wie Objekt und Klasse ist die Templateklasse eine Ausprägung eines Klassentemplates.

Spezialisierung

Templates lassen sich spezialisieren, d. h. man kann Klassen- und Funktionstemplates (für bestimmte Datentypen als Template-Argumente) gesondert implementieren. Dies erlaubt eine effizientere Implementierung für bestimmte ausgewählte Datentypen, ohne die Schnittstelle des Templates zu verändern. Davon machen auch viele Implementierungen der C++-Standardbibliothek (beispielsweise die der GCC) Gebrauch.

Spezialisierung bei Klassentemplates

Die Containerklasse std::vector der C++-Standardbibliothek kann für den Elementtyp bool als Bitmap implementiert werden, was hilft Speicherplatz einzusparen. Auch entnimmt das Klassentemplate std::basic_string die Informationen zum Umgang mit den einzelnen Zeichen der Struktur char_traits, die für den Datentyp char und beispielsweise auch wchar_t spezialisiert ist.

Die Deklaration von Spezialisierungen ähnelt der von normalen Templates, allerdings sind die dem Schlüsselwort template folgenden spitzen Klammern leer, und dem Funktions- bzw. Klassennamen folgen die Templateparameter.

Beispiel:

template <>
class vector< bool >
{
  // Implementierung von vector als Bitmap
};

Teilweise Spezialisierung

Des Weiteren gibt es auch die so genannte teilweise Spezialisierung (auch partielle Spezialisierung genannt), die die Behandlung von Spezialfällen innerhalb eines Templates ermöglicht.

Beispiel:

template < int zeilen, int spalten >
class Matrix
{
  // Implementierung einer Matrix-Klasse
};
 
template < int zeilen >
class Matrix< zeilen, 1 >
{
  // Implementierung einer 1-spaltigen Matrix-Klasse
};

Wichtig zu erwähnen ist, dass beide Klassen komplett voneinander unabhängig sind, d.h. sie erben weder Konstruktoren oder Destruktoren noch Elementfunktionen bzw. Datenelemente voneinander.

Spezialisierung bei Funktionstemplates

Im Unterschied zu Klassentemplates sind Funktionstemplates nicht teilweise (nur vollständig) spezialisierbar. Allerdings wird von der Spezialisierung von Funktionstemplates allgemein abgeraten, da die Regeln für die Bestimmung der „am besten passenden“ Funktion sonst zu unintuitiven Ergebnissen führen können (siehe [1]).

Durch Überladen von Funktionstemplates mit anderen Funktionstemplates kann man in den meisten Fällen das Gleiche erreichen wie durch die (nicht zulässige) teilweise Spezialisierung. Falls diese Technik aus jedwedem Grund im konkreten Fall nicht anwendbar ist – z. B. wenn ein Template von Klassenmethoden spezialisiert werden soll ohne die Klassendefinition zu erweitern – so kann man auch das Problem der Spezialisierung auf ein Template einer Hilfsklasse verlagern:

class Example
{
  private:
    template< typename T >
    struct Frobnicator
    {
      static T do_frobnicate(T param);
    };
 
  public:
    template< typename T >
    T frobnicate(T param);
};
 
template< typename T >
T Example::frobnicate(T param)
{
  // Frobnicator soll die eigentliche Arbeit verrichten
  return Frobnicator<T>::do_frobnicate(param);
}
 
template< typename T >
T Example::Frobnicator<T>::do_frobnicate(T param)
{
  // Standardimplementierung ...
}
 
template<>
int Example::Frobnicator<int>::do_frobnicate(int param)
{
  // ints werden auf andere Weise "frobnifiziert"
  return (param << 3) + (param % 7) - param + foobar;
}

Template-Templates

Mit Template-Templates werden Templates bezeichnet, die wiederum als Parameter von Templates verwendet werden. Sie stellen einen weiteren Abstraktionsmechanismus zur Verfügung. Im folgenden Beispiel wird sowohl der Typ als auch der verwendete Container angegeben; letzterer mit Hilfe eines Template-Templates:

template < template < typename, typename > class Container, typename Type >
class Example
{
  Container< Type, std::allocator < Type > > baz;
};

Beispiel zur Verwendung:

Example < std::deque, int > example;

Weiterführende Themen


Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Template metaprogramming — is a metaprogramming technique in which templates are used by a compiler to generate temporary source code, which is merged by the compiler with the rest of the source code and then compiled. The output of these templates include compile time… …   Wikipedia

  • Template matching — is a technique in Digital image processing for finding small parts of an image which match a template image. It can be used in manufacturing as a part of quality control, [Aksoy, M. S., O. Torkul, and I. H. Cedimoglu. An industrial visual… …   Wikipedia

  • Template Toolkit — Template Toolkit  мощная «легковесная» perl библиотека для работы с шаблонами, позволяющая разделять код, данные и представление. «Легковесная» в данном случае обозначает, что взаимодействие с пользователем, работа с базой данных, вызов… …   Википедия

  • Template — may mean:*a stencil, pattern or overlay used in graphic arts (drawing, painting, etc) and sewing to replicate letters, shapes or designs *a pre developed page layout in electronic or paper media used to create new pages from the same design,… …   Wikipedia

  • Template-Toolkit — Entwickler Andy Wardley Aktuelle Version 2.22 (21. Juli 2009) Betriebssystem Linux, Mac OS X, Windows, u. a. Kategorie Programm und Bibliothekssammlun …   Deutsch Wikipedia

  • template — UK US /ˈtempleɪt/ noun [C] ► a method or system that can be copied and used by others: serve/act as a template (for sth) »The deal will act as a template for future negotiations. provide/create/become a template (for sth) »Transport for London… …   Financial and business terms

  • Template Haskell — is an experimental language extension to the programming language Haskell implemented in the Glasgow Haskell Compiler (version 6 and later).In early incarnations it was also known as Template Meta Haskell.It allows compile time metaprogramming… …   Wikipedia

  • Template engine — may refer to any of the following:* For all uses in generating output from templates, see template processor * For use exclusively in a web template system, see template engine (web) * For use exclusively in word processing applications, see mail …   Wikipedia

  • Template system (disambiguation) — Template system can refer to: * Any system that uses templates in its process including automated or manual labor methods. **A system that uses mechanical templates as the case in manufacturing. **A computerized template system such as a web… …   Wikipedia

  • Template system formalism — can have several meanings:Web template system (formalism).Template system formalism/FAQ …   Wikipedia

  • Template Method (patrón de diseño) — Template method: diagrama de clases en UML. Un Template Method es un patrón de diseño que define una estructura algorítmica en la súper clase, delegando la implementación a las subclases. Es decir, define una serie de pasos, en donde los pasos… …   Wikipedia Español

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”