Like ordinary functions, function templates can be overloaded.
That is, you can have different function definitions with the same function name
so that when that name is used in a function call, a C++ compiler must decide
which one of the various candidates to call. The rules for this decision may
become rather complicated, even without templates. In this section we discuss
overloading when templates are involved. If you are not familiar with the basic
rules of overloading without templates.
The following short program illustrates overloading a function
template:
As this example shows, a nontemplate function can coexist with
a function template that has the same name and can be instantiated with the same
type. All other factors being equal, the overload resolution process normally
prefers this nontemplate over one generated from the template. The fourth call
falls under this rule:
If the template can generate a function with a better match,
however, then the template is selected. This is demonstrated by the second and
third call of max():
It is also possible to specify explicitly an empty template
argument list. This syntax indicates that only templates may resolve a call, but
all the template parameters should be deduced from the call arguments:
Because automatic type conversion is not considered for
templates but is considered for ordinary functions, the last call uses the
nontemplate function (while 'a' and 42.7 both are converted to
int):
A more useful example would be to overload the maximum template
for pointers and ordinary C-strings:
Note that in all overloaded implementations, we pass all
arguments by reference. In general, it is a good idea not to change more than
necessary when overloading function templates. You should limit your changes to
the number of parameters or to specifying template parameters explicitly.
Otherwise, unexpected effects may happen. For example, if you overload the
max() template, which passes the arguments by reference, for two
C-strings passed by value, you can't use the three-argument version to compute
the maximum of three C-strings:
The problem is that if you call max() for three
C-strings, the statement
becomes an error. This is because for C-strings,
max(a,b) creates a new, temporary local value that may be returned by
the function by reference.
This is only one example of code that might behave differently
than expected as a result of detailed overload resolution rules. For example,
the fact that not all overloaded functions are visible when a corresponding
function call is made may or may not matter. In fact, defining a three-argument
version of max() without having seen the declaration of a special
two-argument version of max() for ints causes the two-argument
template to be used by the three-argument version:
No comments:
Post a Comment