|
C++ Programming Tutorials
Basics of C++
Structure of a
program
Variables
Data types
Constants
Operators
Basic Input/output
Control Structures
Control Structures
Functions (I)
Functions (II)
Compound Data Types
Arrays
Character Sequences
Pointers
Dynamic Memory
Data Structures
Other Data Types
Object Oriented Programming
Classes [I]
Classes [II]
Friendship & Inheritance
Polymorphism
Advanced Concepts
Templates
Namespaces
Exceptions
Type Casting
Preprocessor Directives
C++ Standard Library
Input/output with Files
Soft Skills
Communication Skills
Leadership Skills
.........More
|
|
C++ Programming Tutorials
Templates
Function templates
unction templates are special functions that can operate with generic
types. This allows us to create a function template whose functionality
can be adapted to more than one type or class without repeating the
entire code for each type.
In C++ this can be achieved using template parameters. A template
parameter is a special kind of parameter that can be used to pass a type
as argument: just like regular function parameters can be used to pass
values to a function, template parameters allow to pass also types to a
function. These function templates can use these parameters as if they
were any other regular type.
The format for declaring function templates with type parameters is:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
The only difference between both prototypes is the use of either the
keyword class or the keyword typename. Its use is indistinct, since both
expressions have exactly the same meaning and behave exactly the same
way.
For example, to create a template function that returns the greater one
of two objects we could use:
template <class myType>
myType GetMax (myType a, myType b) {
return (a>b?a:b);
} |
Here we have created a template function with myType as its
template parameter. This template parameter represents a type that has not yet
been specified, but that can be used in the template function as if it were a
regular type. As you can see, the function template GetMax returns the greater
of two parameters of this still-undefined type.
To use this function template we use the following format for the function call:
function_name <type> (parameters);
For example, to call GetMax to compare two integer values of type int we can
write:
int x,y;
GetMax <int> (x,y); |
When the compiler encounters this call to a template
function, it uses the template to automatically generate a function replacing
each appearance of myType by the type passed as the actual template parameter
(int in this case) and then calls it. This process is automatically performed by
the compiler and is invisible to the programmer.
Here is the entire example:
// function template
#include <iostream>
using namespace std;
template <class T>
T GetMax (T a, T b) {
T result;
result = (a>b)? a : b;
return (result);
}
int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax<int>(i,j);
n=GetMax<long>(l,m);
cout << k << endl;
cout << n << endl;
return 0;
} |
6
10
|
In this case, we have used T as the template parameter name
instead of myType because it is shorter and in fact is a very common template
parameter name. But you can use any identifier you like.
In the example above we used the function template GetMax() twice. The first
time with arguments of type int and the second one with arguments of type long.
The compiler has instantiated and then called each time the appropriate version
of the function.
As you can see, the type T is used within the GetMax() template function even to
declare new objects of that type:
Therefore, result will be an object of the same type as the
parameters a and b when the function template is instantiated with a specific
type.
In this specific case where the generic type T is used as a parameter for GetMax
the compiler can find out automatically which data type has to instantiate
without having to explicitly specify it within angle brackets (like we have done
before specifying <int> and <long>). So we could have written instead:
Since both i and j are of type int, and the compiler can
automatically find out that the template parameter can only be int. This
implicit method produces exactly the same result:
// function template II
#include <iostream>
using namespace std;
template <class T>
T GetMax (T a, T b) {
return (a>b?a:b);
}
int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax(i,j);
n=GetMax(l,m);
cout << k << endl;
cout << n << endl;
return 0;
} |
6
10
|
Notice how in this case, we called our function template
GetMax() without explicitly specifying the type between angle-brackets <>. The
compiler automatically determines what type is needed on each call.
Because our template function includes only one template parameter (class T) and
the function template itself accepts two parameters, both of this T type, we
cannot call our function template with two objects of different types as
arguments:
int i;
long l;
k = GetMax (i,l); |
This would not be correct, since our GetMax function template
expects two arguments of the same type, and in this call to it we use objects of
two different types.
We can also define function templates that accept more than one type parameter,
simply by specifying more template parameters between the angle brackets. For
example:
template <class T, class U>
T GetMin (T a, U b) {
return (a<b?a:b);
} |
In this case, our function template GetMin() accepts two
parameters of different types and returns an object of the same type as the
first parameter (T) that is passed. For example, after that declaration we could
call GetMin() with:
int i,j;
long l;
i = GetMin<int,long> (j,l); |
or simply:
even though j and l have different types, since the compiler
can determine the appropriate instantiation anyway.
NEXT >> Class
Templates
Have a Question ?
post your questions here. It
will be answered as soon as possible.
Check
C Aptitude Questions
for more C Aptitude Interview Questions with Answers
Check
C Interview Questions
for more C Interview Questions with Answers.
|