C++ Academy · Lektion

Funktions- och klasstemplates i repetition

Skriv generiska funktioner och klasser med korrekt templatesyntax

Lektion 1 av 414 steg

Funktions- och klasstemplates i repetition är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Varför mallar?

Mallar låter dig skriva kod en gång och låta kompilatorn generera specifika versioner för varje typ som används. En grundpelare inom generisk programmering.

Syntax för funktionsmallar

Deklarera typparametrar med template <typename T>. Använd T i funktionssignaturen.

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

std::cout << max_of(3, 7);          // int
std::cout << max_of(2.5, 1.5);      // double

typename kontra class

Nyckelorden typename och class är utbytbara i deklarationer av mallparametrar. typename är vanligare i modern kodstil.

Flera typparametrar

Mallar kan ha flera typparametrar.

template <typename T, typename U>
auto combine(T a, U b) -> decltype(a + b) {
    return a + b;
}

Parametrar som inte är typer

Mallparametrar kan även vara värden i stället för typer: heltal, uppräkningar och pekare.

template <typename T, size_t N>
struct StaticArray {
    T data[N];
};

StaticArray<int, 10> arr;

Klassmallar

Generiska klasser använder samma syntax för mallar. Använd typparametern för medlemmar och metoder.

template <typename T>
class Stack {
    std::vector<T> data_;
public:
    void push(T x) { data_.push_back(std::move(x)); }
    T pop()        { T t = std::move(data_.back()); data_.pop_back(); return t; }
};

Stack<int> s1;
Stack<std::string> s2;

Medlemsfunktioner utanför klassen

Definitioner utanför klassen behöver mallprefixet för varje medlem.

template <typename T>
class Stack {
public:
    void push(T x);
};

template <typename T>
void Stack<T>::push(T x) {
    data_.push_back(std::move(x));
}

Standardargument för mallar

Som standardargument för funktioner. Används när anroparen inte anger något.

template <typename T = int>
class Box {
    T value;
};

Box<> b;       // T is int

Härledning av mallargument

Kompilatorn härleder ofta mallargumenten från anropet.

template <typename T>
void print(T x) { std::cout << x; }

print(42);          // T deduced as int
print("hello");    // T deduced as const char*
print<double>(3);   // explicit

Härledning av klassmallargument (C++17)

C++17 låter dig utelämna klassmallargument när de kan härledas från konstruktorn.

std::pair p(1, 2.5);            // pair<int, double>
std::vector v{1, 2, 3};         // vector<int>

Tvåfasuppslagning

Mallar genomgår namnuppslagning i två faser – vid definitionen (icke-beroende namn) och vid instansieringen (beroende namn). Detta upptäcker många fel redan vid definitionen.

Felmeddelanden

Mallfel kan verka avskräckande. Läs nerifrån och upp, fokusera på källkodspositionen och använd C++20-koncept för att förbättra diagnostiken.

Snabbkontroll

Vilken funktion gör att std::vector v{1, 2, 3}; kan kompileras utan att std::vector<int> anges?

Sammanfattning

Mallar genererar typspecifik kod vid kompilering. Definiera funktions- och klassmallar med template <typename T>. Kompilatorn härleder argument när det är möjligt – ange dem uttryckligen när det behövs.

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Funktions- och klasstemplates i repetition” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Funktions- och klasstemplates i repetition”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Funktions- och klasstemplates i repetition”?

Skriv generiska funktioner och klasser med korrekt templatesyntax Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Funktions- och klasstemplates i repetition”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Funktions- och klasstemplates i repetition
  2. Templatespecialisering: partiell och fullständig
  3. Variadiska templates och parameter packs
  4. constexpr-funktioner och if constexpr
← Tillbaka till C++ Academy