C++ Academy · Lektion

Funktions- og klasseskabeloner – repetition

Skriv generiske funktioner og klasser med korrekt skabelonsyntaks

Lektion 1 af 414 trin

Funktions- og klasseskabeloner – repetition er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvorfor skabeloner?

Skabeloner lader dig skrive kode én gang og få compileren til at generere specifikke versioner for hver anvendt type. Det er en hjørnesten i generisk programmering.

Syntaks for funktionsskabeloner

Deklarér typeparametre med template <typename T>. Brug 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

Nøgleordene typename og class kan bruges om hinanden i deklarationer af skabelonparametre. typename er mest almindeligt i moderne kodestil.

Flere typeparametre

Skabeloner kan have flere typeparametre.

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

Parametre, der ikke er typer

Skabelonparametre kan også være værdier, der ikke er typer: heltal, enumereringer og pointere.

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

StaticArray<int, 10> arr;

Klasseskabeloner

Generiske klasser bruger den samme skabelonsyntaks. Brug typeparameteren til 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;

Medlemsfunktioner uden for klassen

Definitioner uden for klassen skal have template-præfikset på 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 til skabeloner

Det fungerer ligesom standardargumenter til funktioner. De bruges, når kaldet ikke angiver en værdi.

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

Box<> b;       // T is int

Udledning af skabelonargumenter

Compileren udleder ofte skabelonargumenterne ud fra kaldet.

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

Udledning af klasseskabelonargumenter (C++17)

C++17 lader dig udelade klasseskabelonargumenter, når de kan udledes fra konstruktøren.

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

Tofaset opslag

Skabeloner gennemgår navneopslag i to faser — ved definitionen (ikke-afhængige navne) og ved instansieringen (afhængige navne). Det fanger mange fejl allerede ved definitionen.

Fejlmeddelelser

Fejl i skabeloner kan virke skræmmende. Læs dem nedefra og op, fokusér på kildeplaceringen, og brug C++20 concepts til at forbedre diagnosticeringen.

Hurtigt tjek

Hvilken funktion gør, at std::vector v{1, 2, 3}; kan kompileres uden at angive std::vector<int>?

Opsummering

Skabeloner genererer typespecifik kode ved kompilering. Definér funktions- og klasseskabeloner med template <typename T>. Compileren udleder argumenterne, når det er muligt — angiv dem eksplicit, når det er nødvendigt.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Funktions- og klasseskabeloner – repetition” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Funktions- og klasseskabeloner – repetition”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Funktions- og klasseskabeloner – repetition”?

Skriv generiske funktioner og klasser med korrekt skabelonsyntaks Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Funktions- og klasseskabeloner – repetition”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Funktions- og klasseskabeloner – repetition
  2. Skabelonspecialisering: delvis og fuldstændig
  3. Variadiske skabeloner og parameterpakker
  4. constexpr-funktioner og if constexpr
← Tilbage til C++ Academy