Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Implisiittinen ja Eksplisiittinen Tyyppimääritys | Mallipohjien Käyttö
C++-Template-Luokat

Implisiittinen ja Eksplisiittinen Tyyppimääritys

Pyyhkäise näyttääksesi valikon

Implisiittinen tyyppimääritys

Useimmissa tapauksissa C++-kääntäjä pystyy automaattisesti päättelemään templatetyypin funktiolle annetuista argumenteista. Jos parametrien tyypit sisältävät kaiken tarvittavan tiedon, tyyppiä ei tarvitse määrittää erikseen.

main.cpp

main.cpp

12345678910111213
#include <iostream> template<typename T> void PrintValue(T value) { std::cout << value << std::endl; } // The compiler assigns the type for `T` // Based on the type of the passed argument `value` int main() { PrintValue(42); // `T` is deduced as `int` PrintValue(3.14); // `T` is deduced as `double` PrintValue("Hello"); // `T` is deduced as `const char*` }

Kääntäjä päättelee automaattisesti template-parametrin T tyypin funktion argumenttien perusteella. Tämä tekee funktiokutsuista tiiviimpiä ja helpommin luettavia. Tämän vuoksi olet saattanut käyttää templateja huomaamattasi.

main.cpp

main.cpp

header.h

header.h

123456789101112
#include <iostream> int main() { int a = 300; int b = 200; // `std::swap` is actually a template and you can prove it // Try to specify `int` type explicitly `std::swap<int>` std::swap(a, b); std::cout << a << " " << b << std::endl; }

Eksplisiittinen tyyppimääritys

Kaiken tämän jälkeen herää kysymys: Jos tyyppipäättely on implisiittistä, miksi tyyppi pitäisi määrittää eksplisiittisesti? Tämä johtuu siitä, että on tilanteita, joissa automaattinen tyyppipäättely ei toimi tai ei ole riittävä, jolloin mallin tyyppi täytyy määrittää eksplisiittisesti. Katso esimerkkejä.

ambiguous.cpp

ambiguous.cpp

forcing_type.cpp

forcing_type.cpp

no_parameters.cpp

no_parameters.cpp

12345678910
#include <iostream> template<typename T> T GetDefaultValueSum(T a, T b) { return a + b; } int main() { // If `float` won't be specified, this code would generate an error std::cout << GetDefaultValueSum<float>(2, 2.5) << std::endl; }
question mark

Mikä seuraavista on väärä vaihtoehto korvaamaan paikkamerkki ___ seuraavassa koodissa?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 2. Luku 2
some-alt