Function template resolution
There are two step to resolve what function to use when calling a templated functions.
-
solve all arguments in parallel.
-
verify if there’s any inconsistency.
#include <iostream> template <class A, class B> void function(A a, B b) { std::cout << __PRETTY_FUNCTION__ << "\n"; } int main() { function(10, 20); // void function(A, B) [with A = int; B = int] function("", 's'); // void function(A, B) [with A = const char*; B = char] }
-
parameter packs are greedy and will use as much options as possible.
-
Eliminate specialization if one or more parameters cannot be deduced.
-
Fail if more than one template matches.
-
Fail if all templates are eliminated.