Implicit och Explicit Typspecificering
Svep för att visa menyn
Implicit typangivelse
I de flesta fall kan C++-kompilatorn automatiskt avgöra malltypen utifrån argumenten som skickas till funktionen. Om parametertyperna ger all nödvändig information finns det inget behov av att ange typen explicit.
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*` }
Kompilatorn avgör automatiskt typen för mallparametern T baserat på funktionsargumenten. Detta gör funktionsanropen mer kortfattade och lättare att läsa. Av denna anledning kan du faktiskt redan ha använt mallar utan att inse 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; }
Explicit typangivelse
Med allt detta uppstår en fråga: Om typdeduktion sker implicit, varför ange typen explicit? Detta beror på att det finns situationer där automatisk typdeduktion inte fungerar eller inte är tillräcklig, vilket kräver att du anger malltypen explicit. Titta på några exempel.
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; }
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal