← SEARCHABLE ARCHIVE
C / C++ · 2026-07-22

C++ von den Grundlagen bis zum Profi — Folge 13

Reduzieren Sie doppelten Code unterschiedlicher Art mit Vorlagen

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Es gibt Zeiten, in denen die Funktion zum Finden einer Gegenstands-ID und die Funktion zum Finden einer Monster-ID fast die gleiche Form haben. Wenn sich nur der Datentyp unterscheidet und das Verhalten gleich ist, können Sie mithilfe von Vorlagen gemeinsame Regeln erstellen, anstatt Code zu kopieren.

Funktionsvorlage

Beginnen wir mit der Erstellung einer Funktion, die den größeren der beiden Werte zurückgibt.

template <typename T>
T Max(const T& a, const T& b)
{
    return a < b ? b : a;
}

int highLevel = Max(10, 20);
float highDamage = Max(12.5f, 8.0f);

Tist ein Ort, der sich beim Aufruf einer Funktion in den tatsächlichen Typ ändert. Der CompilerMax<int>UndMax<float>Erstellen Sie jede Funktion nach Bedarf.

AberMax(10, 3.5f)Wenn unterschiedliche Typen übergeben werden, schlägt die Kompilierung fehl, da ein T nicht ermittelt werden kann. Sie müssen die Typen oder Designvorlagen, die beide Typen separat akzeptieren, explizit anpassen.

Klassenvorlage

Wenn Sie den gleichen Slot für mehrere Typen verwenden möchten, können Sie auch eine Klasse als Vorlage erstellen.

template <typename T, std::size_t Size>
class Inventory
{
public:
    T& At(std::size_t index)
    {
        return slots.at(index);
    }

    const T& At(std::size_t index) const
    {
        return slots.at(index);
    }

private:
    std::array<T, Size> slots{};
};

Inventory<Item, 20> itemInventory;
Inventory<Skill, 8> skillInventory;

T ist der Typ und Größe ist ein Wert, der zur Kompilierungszeit bestimmt wird. std::arrayDa sich die Größe zur Laufzeit nicht ändert, eignet es sich gut zum Ausdrücken eines festen Slots.

Vorlagen und Header-Dateien

Eine reguläre Funktion kann ihre Deklaration im Header und ihre Definition in cpp haben. Allerdings muss die Definition einer Vorlage zu dem Zeitpunkt sichtbar sein, zu dem der Compiler Code für den tatsächlichen Typ erstellt.

// Inventory.h
template <typename T>
class Inventory
{
public:
    void Add(const T& value)
    {
        values.push_back(value);
    }

private:
    std::vector<T> values;
};

Daher werden Vorlagendefinitionen normalerweise in die Kopfzeile geschrieben. Wenn Sie nur die Deklaration in den Header einfügen und die Definition in cpp ausblenden, kann es zu einem Linkfehler kommen, weil ein bestimmter Codetyp nicht gefunden werden kann.

Kriterien für die Verwendung von Vorlagen

Wenn der Code von einem anderen Typ ist, aber die gleiche Bedeutung hat, reduziert eine Vorlage die Duplizierung. Wenn umgekehrt Code mit unterschiedlichen Aktionen und Verantwortlichkeiten in eine einzige Vorlage gezwungen wird, nehmen bedingte Anweisungen und spezielle Verarbeitung zu.

Vorlagen sind keine Funktion, die den gesamten Code verallgemeinert. Es ist besser, es als ein Tool zu betrachten, das dieselben Regeln sicher auf mehrere Typen anwendet und falsche Kombinationen in der Kompilierungsphase verhindert.