C++ Academy · leksjon

Funksjons- og klassemalskoder på nytt

Skriv generiske funksjoner og klasser med korrekt malsyntaks.

Leksjon 1 av 414 trinn

Funksjons- og klassemalskoder på nytt er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hvorfor bruke maler

Maler gjør det mulig å skrive kode én gang og la kompilatoren generere spesifikke versjoner for hver type som brukes. Dette er en grunnpilar i generisk programmering.

Syntaks for funksjonsmaler

Deklarer typeparametere med template <typename T>. Bruk T i funksjonssignaturen.

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

Nøkkelordene typename og class kan brukes om hverandre i deklarasjoner av malparametere. typename er vanligst i moderne stil.

Flere typeparametere

Maler kan ha flere typeparametere.

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

Parametere som ikke er typer

Malparametere kan også være verdier som ikke er typer: heltall, enumerasjoner og pekere.

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

StaticArray<int, 10> arr;

Klassedeklarasjoner med maler

Generiske klasser bruker den samme malsyntaksen. Bruk typeparameteren for medlemmer og 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;

Medlemsfunksjoner utenfor klassen

Definisjoner utenfor klassen trenger malprefikset for hvert 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));
}

Standardargumenter for maler

På samme måte som standardargumenter for funksjoner. Brukes når kalleren ikke angir en verdi.

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

Box<> b;       // T is int

Deduksjon av malargumenter

Kompilatoren utleder ofte malargumentene fra funksjonskallet.

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

Deduksjon av argumenter for klassedeklarasjoner med maler (C++17)

C++17 gjør det mulig å utelate malargumentene for klasser når de kan utledes fra konstruktøren.

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

Oppslag i to faser

Maler gjennomgår navneoppslag i to faser — ved definisjon (ikke-avhengige navn) og ved instansiering (avhengige navn). Dette fanger opp mange feil allerede ved definisjonen.

Feilmeldinger

Feil i maler kan virke skremmende. Les nedenfra og opp, fokuser på plasseringen i kildekoden, og bruk C++20-konsepter for å forbedre diagnostikken.

Hurtigsjekk

Hvilken funksjon gjør at std::vector v{1, 2, 3}; kan kompileres uten å angi std::vector<int>?

Oppsummering

Maler genererer typespesifikk kode under kompilering. Definer funksjons- og klassemaler med template <typename T>. Kompilatoren utleder argumentene når det er mulig — angi dem eksplisitt når det er nødvendig.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Funksjons- og klassemalskoder på nytt» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Funksjons- og klassemalskoder på nytt», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Funksjons- og klassemalskoder på nytt»?

Skriv generiske funksjoner og klasser med korrekt malsyntaks. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Funksjons- og klassemalskoder på nytt»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Funksjons- og klassemalskoder på nytt
  2. Malespesialisering: partiell og full
  3. Variadiske maler og parameterpakker
  4. constexpr-funksjoner og if constexpr
← Tilbake til C++ Academy