Implicit og Eksplicit Typespecifikation
Stryg for at vise menuen
Implicit typeangivelse
I de fleste tilfælde kan C++-kompilatoren automatisk bestemme skabelontypen ud fra de argumenter, der gives til funktionen. Hvis parametertyperne giver alle nødvendige oplysninger, er det ikke nødvendigt at angive typen eksplicit.
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*` }
Kompilatoren bestemmer automatisk typen af skabelonparameteren T baseret på funktionsargumenterne. Dette gør funktionskald mere kortfattede og lettere at læse. Af denne grund har du måske allerede brugt skabeloner uden at være klar over det.
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; }
Eksplicit typespecifikation
Med alt dette opstår spørgsmålet: Hvis typenedledning er implicit, hvorfor så overhovedet specificere typen eksplicit? Dette skyldes, at der findes scenarier, hvor automatisk typenedledning ikke fungerer eller ikke er tilstrækkelig, hvilket kræver, at du specificerer skabelontypen eksplicit. Se et eksempel her.
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; }
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat