Funksjons- og klassemalskoder på nytt
Skriv generiske funksjoner og klasser med korrekt malsyntaks.
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); // doubletypename 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 intDeduksjon 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); // explicitDeduksjon 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.
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
- Funksjons- og klassemalskoder på nytt
- Malespesialisering: partiell og full
- Variadiske maler og parameterpakker
- constexpr-funksjoner og if constexpr