Chapter 16
Templates
Copyright © 2016 Pearson, Inc.
All rights reserved.
Learning Objectives
• Function Templates
– Syntax, defining
– Compiler complications
• Class Templates
– Syntax
– Example: array template class
• Templates and Inheritance
– Example: partially-filled array template class
Copyright © 2016 Pearson Inc. All rights reserved. 16-2
Introduction
• C++ templates
– Allow very "general" definitions for functions and
classes
– Type names are "parameters" instead of
actual types
– Precise definition determined at run-time
Copyright © 2016 Pearson Inc. All rights reserved. 16-3
Function Templates
• Recall function swapValues:
void swapValues(int& var1, int& var2)
{
int temp;
temp = var1;
var1 = var2;
var2 = temp;
}
• Applies only to variables of type int
• But code would work for any types!
Copyright © 2016 Pearson Inc. All rights reserved. 16-4
Function Templates vs. Overloading
• Could overload function for chars:
void swapValues(char& var1, char& var2)
{
char temp;
temp = var1;
var1 = var2;
var2 = temp;
}
• But notice: code is nearly identical!
– Only difference is type used in 3 places
Copyright © 2016 Pearson Inc. All rights reserved. 16-5
Function Template Syntax
• Allow "swap values" of any type variables:
template<class T>
void swapValues(T& var1, T& var2)
{
T temp;
temp = var1;
var1 = var2;
var2 = temp;
}
• First line called "template prefix"
– Tells compiler what’s coming is "template"
– And that T is a type parameter
Copyright © 2016 Pearson Inc. All rights reserved. 16-6
Template Prefix
• Recall:
template<class T>
• In this usage, "class" means "type", or
"classification"
• Can be confused with other "known" use
of word "class"!
– C++ allows keyword "typename" in place of
keyword "class" here
– But most use "class" anyway
Copyright © 2016 Pearson Inc. All rights reserved. 16-7
Template Prefix 2
• Again:
template<class T>
• T can be replaced by any type
– Predefined or user-defined (like a C++ class type)
• In function definition body:
– T used like any other type
• Note: can use other than "T", but T is
"traditional" usage
Copyright © 2016 Pearson Inc. All rights reserved. 16-8
Function Template Definition
• swapValues() function template is actually
large "collection" of definitions!
– A definition for each possible type!
• Compiler only generates definitions when
required
– But it’s "as if" you’d defined for all types
• Write one definition works for all types
that might be needed
Copyright © 2016 Pearson Inc. All rights reserved. 16-9
Calling a Function Template
• Consider following call:
swapValues(int1, int2);
– C++ compiler "generates" function definition for
two int parameters
using template
• Likewise for all other types
• Needn’t do anything "special" in call
– Required definition automatically generated
Copyright © 2016 Pearson Inc. All rights reserved. 16-10
Another Function Template
• Declaration/prototype:
Template<class T>
void showStuff(int stuff1, T stuff2, T stuff3);
• Definition:
template<class T>
void showStuff(int stuff1, T stuff2, T stuff3)
{
cout << stuff1 << endl
<< stuff2 << endl
<< stuff3 << endl;
}
Copyright © 2016 Pearson Inc. All rights reserved. 16-11
showStuff Call
• Consider function call:
showStuff(2, 3.3, 4.4);
• Compiler generates function definition
– Replaces T with double
• Since second parameter is type double
• Displays:
2
3.3
4.4
Copyright © 2016 Pearson Inc. All rights reserved. 16-12
Compiler Complications
• Function declarations and definitions
– Typically we have them separate
– For templates not supported on
most compilers!
• Safest to place template function
definition in file where invoked
– Many compilers require it appear 1st
– Often we #include all template definitions
Copyright © 2016 Pearson Inc. All rights reserved. 16-13
More Compiler Complications
• Check your compiler’s specific requirements
– Some need to set special options
– Some require special order of arrangement
of template definitions vs. other file items
• Most usable template program layout:
– Template definition in same file it’s used
– Ensure template definition precedes all uses
• Can #include it
Copyright © 2016 Pearson Inc. All rights reserved. 16-14
Multiple Type Parameters
• Can have:
template<class T1, class T2>
• Not typical
– Usually only need one "replaceable" type
– Cannot have "unused"
template parameters
• Each must be "used" in definition
• Error otherwise!
Copyright © 2016 Pearson Inc. All rights reserved. 16-15
Algorithm Abstraction
• Refers to implementing templates
• Express algorithms in "general" way:
– Algorithm applies to variables of any type
– Ignore incidental detail
– Concentrate on substantive parts
of algorithm
• Function templates are one way C++
supports algorithm abstraction
Copyright © 2016 Pearson Inc. All rights reserved. 16-16
Defining Templates Strategies
• Develop function normally
– Using actual data types
• Completely debug "ordinary" function
• Then convert to template
– Replace type names with type parameter
as needed
• Advantages:
– Easier to solve "concrete" case
– Deal with algorithm, not template syntax
Copyright © 2016 Pearson Inc. All rights reserved. 16-17
Inappropriate Types in Templates
• Can use any type in template for which
code makes "sense"
– Code must behave in appropriate way
• e.g., swapValues() template function
– Cannot use type for which assignment operator isn’t
defined
– Example: an array:
int a[10], b[10];
swapValues(a, b);
• Arrays cannot be "assigned"!
Copyright © 2016 Pearson Inc. All rights reserved. 16-18
Class Templates
• Can also "generalize" classes
template<class T>
– Can also apply to class definition
– All instances of "T" in class definition replaced by
type parameter
– Just like for function templates!
• Once template defined, can declare
objects of the class
Copyright © 2016 Pearson Inc. All rights reserved. 16-19
Class Template Definition
• template<class T>
class Pair
{
public:
Pair();
Pair(T firstVal, T secondVal);
void setFirst(T newVal);
void setSecond(T newVal);
T getFirst() const;
T getSecond() const;
private:
T first; T second;
};
Copyright © 2016 Pearson Inc. All rights reserved. 16-20
Template Class Pair Members
• template<class T>
Pair<T>::Pair(T firstVal, T secondVal)
{
first = firstVal;
second = secondVal;
}
template<class T>
void Pair<T>::setFirst(T newVal)
{
first = newVal;
}
Copyright © 2016 Pearson Inc. All rights reserved. 16-21
Template Class Pair
• Objects of class have "pair" of values of
type T
• Can then declare objects:
Pair<int> score;
Pair<char> seats;
– Objects then used like any other objects
• Example uses:
score.setFirst(3);
score.setSecond(0);
Copyright © 2016 Pearson Inc. All rights reserved. 16-22
Pair Member Function Definitions
• Notice in member function definitions:
– Each definition is itself a "template"
– Requires template prefix before
each definition
– Class name before :: is "Pair<T>"
• Not just "Pair"
– But constructor name is just "Pair"
– Destructor name is also just "~Pair"
Copyright © 2016 Pearson Inc. All rights reserved. 16-23
Class Templates as Parameters
• Consider:
int addUP(const Pair<int>& the Pair);
– The type (int) is supplied to be used for T
in defining this class type parameter
– It "happens" to be call-by-reference here
• Again: template types can be used
anywhere standard types can
Copyright © 2016 Pearson Inc. All rights reserved. 16-24
Class Templates
Within Function Templates
• Rather than defining new overload:
template<class T>
T addUp(const Pair<T>& the Pair);
//Precondition: Operator + is defined for values
of type T
//Returns sum of two values in thePair
• Function now applies to all kinds
of numbers
Copyright © 2016 Pearson Inc. All rights reserved. 16-25
Restrictions on Type Parameter
• Only "reasonable" types can be substituted
for T
• Consider:
– Assignment operator must be "well-behaved"
– Copy constructor must also work
– If T involves pointers, then destructor must
be suitable!
• Similar issues as function templates
Copyright © 2016 Pearson Inc. All rights reserved. 16-26
Type Definitions
• Can define new "class type name"
– To represent specialized class template name
• Example:
typedef Pair<int> PairOfInt;
• Name "PairOfInt" now used to declare
objects of type Pair<int>:
PairOfInt pair1, pair2;
• Name can also be used as parameter,
or anywhere else type name allowed
Copyright © 2016 Pearson Inc. All rights reserved. 16-27
Friends and Templates
• Friend functions can be used with
template classes
– Same as with ordinary classes
– Simply requires type parameter
where appropriate
• Very common to have friends of
template classes
– Especially for operator overloads (as
we’ve seen)
Copyright © 2016 Pearson Inc. All rights reserved. 16-28
Predefined Template Classes
• Recall vector class
– It’s a template class!
• Another: basic_string template class
– Deals with strings of "any-type" elements
– e.g.,
basic_string<char> works for char’s
basic_string<double> works for doubles
basic_string<YourClass> works for
YourClass objects
Copyright © 2016 Pearson Inc. All rights reserved. 16-29
basic_string Template Class
• Already used it!
• Recall "string"
– It’s an alternate name for basic_string<char>
– All member functions behave similarly for
basic_string<T>
• basic_string defined in library <string>
– Definition is in std namespace
Copyright © 2016 Pearson Inc. All rights reserved. 16-30
Templates and Inheritance
• Nothing new here
• Derived template classes
– Can derive from template or
nontemplate class
– Derived class is then naturally a
template class
• Syntax same as ordinary class derived
from ordinary class
Copyright © 2016 Pearson Inc. All rights reserved. 16-31
Summary
• Function templates
– Define functions with parameter for a type
• Class templates
– Define class with parameter for subparts of class
• Predefined vector and basic_string
classes are template classes
• Can define template class derived from
a template base class
Copyright © 2016 Pearson Inc. All rights reserved. 16-32