0% found this document useful (0 votes)
352 views29 pages

Object-Oriented Programming: Template

The document discusses templates in C++ which allow functions and classes to work with different data types. Templates provide code reusability and flexibility. A function template defines a function with a placeholder data type that can be specified when calling the function. Similarly, a class template defines a class with placeholder data types that must be specified when creating objects of that class. Templates increase code maintainability by eliminating duplicate functions or classes for each data type.

Uploaded by

desh deepak
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
352 views29 pages

Object-Oriented Programming: Template

The document discusses templates in C++ which allow functions and classes to work with different data types. Templates provide code reusability and flexibility. A function template defines a function with a placeholder data type that can be specified when calling the function. Similarly, a class template defines a class with placeholder data types that must be specified when creating objects of that class. Templates increase code maintainability by eliminating duplicate functions or classes for each data type.

Uploaded by

desh deepak
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

1

Object-Oriented Programming:
Template
2

Introduction

• Templates are the foundation of generic programming,


which involves writing code in a way that is independent
of any particular type.
• A template is a blueprint or formula for creating a generic
class or a function.
• In simple terms, you can create a single function or a class
to work with different data types using templates.
• Templates are often used in larger codebase for the
purpose of code reusability and flexibility of the
programs.
3

Function Template
• A function template works in a similar to a normal function,
with one key difference.
• A single function template can work with different data types at
once but, a single normal function can only work with one set
of data types.
• Normally, if you need to perform identical operations on two or
more types of data, you use function overloading to create two
functions with the required function declaration.
• However, a better approach would be to use function templates
because you can perform the same task writing less and
maintainable code
4

Function Template
• The general form of a template function definition is
shown here −
template <class type> ret-type func-name(parameter list)
{
// body of function
}
Here, type is a placeholder name for a data type used by the
function. This name can be used within the function definition.
template <class T>
T someFunction(T arg)
{ ... .. ... }
5

Function Template: Example


#include <iostream> cout << "\nEnter two floating-point
using namespace std; numbers:\n";
// template function cin >> f1 >> f2;
template <class T>
cout << Large(f1, f2) <<" is larger."
T Large(T n1, T n2)
<< endl;
{
return (n1 > n2) ? n1 : n2; cout << "\nEnter two characters:\n";
} cin >> c1 >> c2;
int main() cout << Large(c1, c2) << " has
{ larger ASCII value.";
int i1, i2;
return 0;
float f1, f2;
char c1, c2; }
cout << "Enter two integers:\n";
cin >> i1 >> i2;
cout << Large(i1, i2) <<" is larger."
<< endl;
6

Enter two integers:


5
10
10 is larger.

Enter two floating-point numbers:


12.4
10.2
12.4 is larger.

Enter two characters:


z
Z
z has larger ASCII value.
7

Function Template
• In the above program, a function template Large() is defined that accepts
two arguments n1 and n2 of data type T. T signifies that argument can be of
any data type.
• Large() function returns the largest among the two arguments using a simple
conditional operation.
• Inside the main() function, variables of three different data types: int, float
and char are declared. The variables are then passed to the Large() function
template as normal functions.
• During run-time, when an integer is passed to the template function,
compiler knows it has to generate a Large() function to accept the int
arguments and does so.
• Similarly, when floating-point data and char data are passed, it knows the
argument data types and generates the Large() function accordingly.
• This way, using only a single function template replaced three identical
normal functions and made your code maintainable.
8

Function Template: Example


int main () {
#include <iostream>
int i = 39;
#include <string>
int j = 20;
cout << "Max(i, j): " << Max(i, j)
using namespace std;
<< endl;
double f1 = 13.5;
template <typename T>
double f2 = 20.7;
T const& Max (T const& a, T
cout << "Max(f1, f2): " <<
const& b)
Max(f1, f2) << endl;
{
return a < b ? b:a;
string s1 = "Hello";
}
string s2 = "World";
cout << "Max(s1, s2): " <<
Max(s1, s2) << endl;
return 0; }
9

Output:
Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World
10

Class Template
• Like function templates, you can also create class templates for
generic class operations.
• Sometimes, you need a class implementation that is same for all
classes, only the data types used are different.
• Normally, you would need to create a different class for each
data type OR create different member variables and functions
within a single class.
• This will unnecessarily bloat your code base and will be hard to
maintain, as a change is one class/function should be performed
on all classes/functions.
• However, class templates make it easy to reuse the same code
for all data types.
11

Class Template
template <class T>
class className
{ ... .. ...
public:
T var;
T someOperation(T arg);
};

•In the above declaration, T is the template argument which is a


placeholder for the data type used.
•Inside the class body, a member variable var and a member
function someOperation() are both of type T.
12

Class Template
To create a class template object, you need to define the data type
inside a < > when creation.

className<dataType> classObject;
For example:

className<int> classObject;
className<float> classObject;
className<string> classObject;
13

Example void displayResult()


{
#include <iostream> cout << "Numbers are: " << num1 <<
using namespace std; " and " << num2 << "." << endl;
cout << "Addition is: " << add() <<
template <class T>
endl;
class Calculator cout << "Subtraction is: " <<
{ subtract() << endl;
private: cout << "Product is: " << multiply()
<< endl;
T num1, num2;
cout << "Division is: " << divide() <<
endl;
public: }
Calculator(T n1, T n2)
T add() { return num1 + num2; }
{
num1 = n1; T subtract() { return num1 - num2; }
num2 = n2;
T multiply() { return num1 * num2; }
}
T divide() { return num1 / num2; } };
14
Output
Example
int main() Int results:
{ Numbers are: 2 and 1.
Calculator<int> intCalc(2, 1); Addition is: 3
Calculator<float> Subtraction is: 1
floatCalc(2.4, 1.2); Product is: 2
cout << "Int results:" << endl; Division is: 2
[Link]();
cout << endl << "Float results:" << Float results:
endl; Numbers are: 2.4 and 1.2.
[Link](); Addition is: 3.6
return 0; Subtraction is: 1.2
} Product is: 2.88
Division is: 2
15

Class Template
• In the above program, a class template Calculator is declared.
• The class contains two private members of type T: num1 &
num2, and a constructor to initalize the members.
• It also contains public member functions to calculate the
addition, subtraction, multiplication and division of the
numbers which return the value of data type defined by the
user.
• Likewise, a function displayResult() to display the final output
to the screen.
• In the main() function, two different Calculator objects intCalc
and floatCalc are created for data types: int and float
respectively. The values are initialized using the constructor.
16

Class Template
• Notice we use <int> and <float> while creating the objects.
These tell the compiler the data type used for the class creation.
• This creates a class definition each for int and float, which are
then used accordingly.
• Then, displayResult() of both objects is called which performs
the Calculator operations and displays the output.
17

Template member functions


• A non-template class can have template member functions, if
required.
18

Template member functions


• Unlike a member function for a template class, a
template member function is just like a free template
function but scoped to its containing class.
• In this case the compiler generates a member function
for each (unique) template type.
• As before, the compiler will favour a non-template
overload of a member function.
19

Template functions on template classes


• A template class will typically have member functions
defined in terms of its own template parameter, but
may equally have member functions that are
themselves template functions.
• In this case the member function’s template parameter
is different to the owning class’.
20

Template functions on template classes


21

Template functions on template classes


• The containing class’ template declaration must be
‘outer’ one; func is a template function (typename U)
that belongs to the class Utility<T> (typename T)

• Notice that the template function must have a different


template parameter identifier to its containing class
(even if the same type is being used to instantiate both
the class and the function).
22

Template constructors
• A common application of template member functions
on template classes is constructors; particularly if
inheritance is involved.
23
24

Template constructors
• Above is an example of parameterised inheritance.
• The problem we face is that we cannot determine the structure
of the base class constructor – each base class constructor will
have its own number of parameters, with different types – so
how can we write a Named constructor that satisfies any
potential base class?
• We can deal with different parameter types by making the
Named class constructor a template member function.
25
26

Template constructors
• The constructor for Named has three parameters: a string literal
(const char*) and two template parameter arguments.
• Notice these parameters are passed as r-value references
(Arg&&).
• In the body of the constructor, notice the use of the template
function std::forward.
• This function ensures that the types of the parameters are
forwarded on without changing their types – that is, l-values
remain l-values, r-values remain r-values.
27
28

But our Named constructor is still limited: It will only work for base classes that
have exactly two parameters. If we try and use a class with three parameters we
get a problem:
29

Our Lamp class is a candidate for being the Named base class, since it supports
the display() method. However, its constructor requires three parameters – and
our template constructor can only supply two.

You might also like