230 likes | 398 Views
C++ Templates. Templates Part of the ongoing development of the C++ language Integral part of the larger C++ Standard Library The Standard Template Library. C++ Templates. Based upon the notion of a type variable A variable that takes a type as its value T i, j, k;
E N D
C++ Templates • Templates • Part of the ongoing development of the C++ language • Integral part of the larger C++ Standard Library • The Standard Template Library
C++ Templates • Based upon the notion of a type variable • A variable that takes a type as its value • T i, j, k; • Declares 3 variables • The type of the variables depends upon the value of T • If T is • int variables are of type int • float variables are of type float • user-defined variables are of type user-defined
C++ Templates • Kinds of Templates • Function • Permit the development of generic algorithms • Class • Permit the development of generic objects
C++ Templates • General Syntax • template < T0, T1… Tn> normal declaration or definition • template C++ keyword • Ti One or more formal parameters • A formal parameter • Must be written as: class Ti • Type parameter cannot have default value • Non-type parameter can have default values
C++ Templates • General Syntax - Parameters • Type Parameters • Built-in - Non-type • int • char • float* • User Defined • Functions • In older compilers function templates cannot use non-type parameters. • The function definition can. • Classes • The class template can use non-type parameters.
C++ Templates • Function Templates • template <class T> T min (T var1, T var2); • The function min • Has two arguments: var1, var2 of type T • Returns a variable: of type T • template <class T> T min (T* ptVar1, T* ptVar2); • The function min • Has two arguments ptVar1, ptVar2 of type pointer to T • Returns a variable of type T
C++ Templates • Function Templates • A templated function can be declared • extern • inline • static • template <class T> inline T min (T var1, T var2);
C++ Templates • Function Templates • Writing Function Templates • 1. Write a specific version for each fixed type. • 2. Compile and test each version. • 3. Replace the fixed type with the type parameter. • 4. Add the template header.
C++ Templates • Function Templates • Template Instantiation • 1. The formal parameters in the function signature are examined in turn. A return type cast does not matter. • template <class T> T f(T); • int b; • double aValue = (double) f(b); • T has the value int. • 2. Each formal parameter involving a type parameter is matched with the corresponding argument in the function call. The match binds the type parameter.
C++ Templates • Function Templates • Template Instantiation • 3. All matches must be consistent. Only trivial promotions are allowed. • int& to const int& • 4. Non-Type formal parameters must match without non-trivial conversion or promotion
C++ Templates • Functions • Function Call Resolution • 1. Examine all non-template functions • if an exact match • call that version • if multiple matches • compile error • 2. Examine all template functions • if an exact match • instantiate then call that version • if multiple matches • compile error • 3. Re-examine all non-template functions • Apply call resolution rules for overloaded functions
C++ Templates • Class Templates • Particularly useful for making classes generic • Important application is container classes
C++ Templates • Class Templates • Class Template • Template header • Normal Class Definition • template < class T0, … class Tn, NT0, NT1...> • class ClassName • { • class body • }
C++ Templates • Class Templates • Function Members • Use the same template header as the class • Are instantiated when the compiler first sees a call to it • Syntax • template < class T0, … class Tn, NT0, NT1...> • returnType ClassName< class T0, … class Tn, NT0, NT1...>:: functionName (args) • { • function body • }
C++ Templates • Class Templates • Static Members • A templated class can have static members • Each type has an associated set of static members • Declarations • static T my Function (args) { myFunction body} • static int myValue // must be defined outside of the class • Definition • template <class T> int MyClass<T>::myValue = aValue;
C++ Templates • Class Templates Forward Declarations….. • template <class T> class MyClass // forward reference • …. • ….and Friends • template <class T> class MyClass • { • friend class YourClass<T>; • public: • …… • }
C++ Templates • Class Templates • Declaring an Instance • template <class T> class MyClass • { • public: • …… • } • MyClass <char> myInstance; • Observe the use of <type> as part of the class name
C++ Templates • Class Templates • Definition and Declaration • If using header files, put the declaration and definition both in the header file. • Templates as a type parameter • The value of a type parameter can be a built-in or user defined type. • The user defined type may be non-typed or typed.
C++ Templates • Class Templates • Templates and Inheritance • Derivation works the same as with ordinary classes • One can create a new template object from an existing template
C++ Templates • Class Templates • Default Parameters • Relatively new feature to templates • A default value can be specified in a template definition • Supported by most newer compilers. • Borland 5.0 • Microsoft 4.0 and beyond • template <class T1, class T2 = int> • class MyClass • { ….. }
C++ Templates • Function and Class Templates • Specialization • May need to a special version of a template to handle types not easily included in an existing template. • Function • returnType functionName (args) { function body } • Member Function • className < specialized type> functionMember (args) • { function body } • Class • class className < specialized type> { class body };
C++ Templates • Function and Class Templates • Explicit Instantiation • May wish to create a specific version of a function or class • Function • returnType functionName (args); • Class • class className < explicit type>