Templates and the Standard Template Library - PowerPoint PPT Presentation

1 / 19
About This Presentation
Title:

Templates and the Standard Template Library

Description:

... be created (so just store it for now and don't convert it to m/c instructions) ... enum {DefaultStack =50,EmptyStack =-1 }; Stack(); Stack(int ); ~Stack ... – PowerPoint PPT presentation

Number of Views:28
Avg rating:3.0/5.0
Slides: 20
Provided by: stude1576
Category:

less

Transcript and Presenter's Notes

Title: Templates and the Standard Template Library


1
Templates and the Standard Template Library
  • Part I

2
What are templates?
  • For ADTs such as stacks and queues, it is the
    manner in which the data is stored (rather than
    the precise type of data stored) that defines the
    ADT and its interface.
  • The mechanism supporting genericity in C is the
    template construct.
  • This mechanism is important and powerful and is
    used throughout the Standard Template Library to
    achieve genericity.
  • Templates provide a means to reuse code
  • one template definition can be used to create
    multiple instances of a function (or class), each
    operating on (storing) a different type of data.

3
Function Genericity
  • Lets way we want to swap the value of two
    integers x and y
  • Few possible approaches
  • Write inline code
  • Make the inline code into a function

. . . int temp temp x x y y
temp . . . int temp temp x x y y
temp . . .
where,
void swap(int, int) int temp temp x x
y y temp
. . swap(x,y) . . . swap(x,y) . . .
4
Function Genericity
  • Now that we have a function to swap two ints,
    what if we want to write a function to swap two
    doubles.
  • Easiest approach might be to modify the earlier
    function by changing all int to double
  • Function overloading allows us to use the same
    name.

5
Function Genericity
  • Similarly, we can write any overloaded function
    to swap two strings or any other ADTs
  • A point to note is that the destructor, copy
    constructor and the assignment operator
    should be defined/overloaded for the user defined
    ADTs specially if they member variables that are
    pointers.

// to swap doubles void swap(double x, double
y) double temp temp x x y y temp
// to swap strings void swap(string x, string
y) string temp temp x x y y temp
// to swap ints void swap(int x, int y) int
temp temp x x y y temp
6
Function Genericity
  • The next stage then is to replace the data type
    with a placeholder. This placeholder is termed a
    type parameter and the technique/mechanism used
    is called a template function.

//template version of swap function template
ltclass Tgt void swap(T x, T y) T temp temp
x x y y temp
Template header
Type parameter
7
Function Genericity
  • More about function templates
  • A function template is only a pattern that
    describes how individual functions can be
    constructed from given actual types. This process
    of constructing a function is called
    instantiation. In each instantiation, the type
    parameter is said to be bound to the actual type
    passed to it.
  • The template header gives two pieces of
    information to the compiler
  • The following code is a function template from
    which a function can be created (so just store it
    for now and dont convert it to m/c instructions)
  • The identifier (here, T) is the name of the type
    parameter for this function template that will be
    given a value when the function is called.
  • A function template can have more than one type
    parameter.

8
Class Genericity
  • Container classes like Stack, Queue, etc. might
    be needed to store any kind of data type and lend
    themselves to template implementations quite
    naturally.
  • The next slide shows a few approaches to enable
    creation of stack of different data types.

9
Class Genericity
  • Using ordinary classes

// Stack of ints class Stack public Stack(
) void push (int) int pop( ) int
peek( ) bool IsEmpty( ) bool IsFull(
) private int data10 int top
// Stack of chars class Stack public
Stack( ) void push (char) char pop( )
char peek( ) bool IsEmpty( ) bool
IsFull( ) private char data10 int
top
// Stack of Fractions class Stack public
Stack( ) void push (Fraction) Fraction
pop( ) Fraction peek( ) bool IsEmpty(
) bool IsFull( ) private Fraction
data10 int top
10
Class Genericity
  • Using a typedef statement in class definition
  • reduces amount of code to modify

// Stack of ints class Stack public
typedef int item Stack( ) void push
(item) item pop( ) item peek( )
bool IsEmpty( ) bool IsFull( ) private
item data10 int top
// Stack of chars class Stack public
typedef char item Stack( ) void push
(item) item pop( ) item peek( )
bool IsEmpty( ) bool IsFull( ) private
item data10 int top
// Stack of Fractions class Stack public
typedef Fraction item Stack( ) void
push (item) item pop( ) item peek( )
bool IsEmpty( ) bool IsFull( ) private
item data10 int top
11
Class Genericity
  • Thus, we see even though using a typedef
    statement greatly reduces the code to be modified
    we still have to write three classes to be able
    to have a stack of ints, chars and Fractions.
  • Moreover, if we have to use them in the same
    program, either weve to change their name or put
    them in different namespaces.
  • A better solution is to use templates.

12
Class Genericity
  • Using a template class

// Stack Template Template ltclass itemgt class
Stack public Stack( ) void push
(item) item pop( ) item peek( )
bool IsEmpty( ) bool IsFull( ) private
item data10 int top
13
Class Genericity
  • More about class templates
  • A class template is only a pattern that describes
    how a class can be constructed at the time of
    instantiation
  • The template header gives two pieces of
    information to the compiler
  • The following code is a class template from which
    a class can be created (thus, just store it for
    now and dont convert it to m/c instructions)
  • The identifier (here, T) is the name of the type
    parameter for this class template and will be
    given value at time of instantiation

14
Class Genericity
  • Three important rules that govern building class
    templates
  • All operations defined outside of the class
    declaration must be template functions
  • Any use of the name of the template class as a
    type must be parameterized
  • Operation on a template class should be defined
    in the same file as the class declaration
  • Might want to add another slide with the book
    code for the stack class before or after this
    slide

15
  • //A Template Stack Class (from Section 7.2 in
    textbook)
  • templateltclass T gt
  • class Stack
  • public
  • enum DefaultStack 50,EmptyStack -1
  • Stack()
  • Stack(int )
  • Stack()
  • void push(const T)
  • void pop()
  • T topNoPop()const
  • bool empty()const
  • bool full()const
  • private
  • Telements
  • int top
  • int size
  • void allocate()elements new T size top
    EmptyStack
  • void msg(const charm )const cout ltlt""ltltm
    ltlt""ltltendl

Contd.
16
templateltclass T gt StackltT gtStack()size
DefaultStack allocate() templateltclass T
gt StackltT gtStack(int s )if (s lt0) s-1
else if (s0 ) s DefaultStack
size s allocate() templateltclass T
gt StackltT gt Stack()delete elements templa
teltclass T gt void StackltT gt push(const Te
)assert(!full()) if
(!full())elements top e
else msg("Stack full!") templateltclass T
gt void StackltT gtpop()assert(!empty()) if
(!empty()) top-- else msg("Stack
empty!")
Contd.
17
templateltclass T gt T StackltT gttopNoPop()const
assert(top gtEmptyStack ) if
(!empty())return elements top else
msg("Stack empty!") T dummy_value return
dummy_value templateltclass T gt bool StackltT
gtempty()const return top ltEmptyStack templa
teltclass T gt bool StackltT gtfull()const return
top 1gtsize templateltclass T
gt ostreamoperatorltlt(ostreamos,const StackltT gts
) s.msg("Stack contents") int
s.top while (tgts.EmptyStack )cout
ltlts.elements t--ltltendl return os
18
Class Genericity
  • In addition to at least one class parameter (can
    be more than one), a template class can also use
    a function style parameter.
  • The function style parameter capacity in the
    following implementation of the stack class
    allows the user to specify the size of the stack
    at the time of instantiation.

// Stack template with function style
parameter template ltclass T, int capacitygt class
Stack same definition
// sample instantiation code Stack ltint, 10gt
intSt Stack ltstring, 5gt stringSt
19
Summary
  • Templates make it possible for classes and
    functions to receive not only data values to be
    stored or operated on via parameter but also to
    receive the type of data via a parameter.
  • Templates go a long way in creating generic code
    and promoting code reuse.
Write a Comment
User Comments (0)
About PowerShow.com