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
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
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
forcing_type.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; }
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme