March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Templates F Part of the ongoing development of the C++ language F Integral part of the larger C++ Standard Library The Standard Template Library
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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 intvariables are of type int floatvariables are of type float user-definedvariables are of type user-defined
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Kinds of Templates o Function Permit the development of generic algorithms o Class Permit the development of generic objects
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates General Syntax template normal declaration or definition template C++ keyword T i One or more formal parameters A formal parameter Must be written as:class T i Type parameter cannot have default value Non-type parameter can have default values
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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.
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Function Templates template T min (T var1, T var2); The function min Has two arguments:var1, var2 of type T Returns a variable:of type T template T min (T* ptVar1, T* ptVar2); The function min Has two arguments ptVar1, ptVar2 of type pointer to T Returns a variableof type T
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Function Templates A templated function can be declared extern inline static template inline T min (T var1, T var2);
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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.
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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 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.
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Class Templates oParticularly useful for making classes generic oImportant application is container classes
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Class Templates Class Template Template header Normal Class Definition template class ClassName { class body }
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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 returnType ClassName :: functionName (args) { function body }
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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 int MyClass ::myValue = aValue;
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Class Templates Forward Declarations….. template class MyClass // forward reference …. ….and Friends template class MyClass { friend class YourClass ; public: …… }
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Class Templates Declaring an Instance template class MyClass { public: …… } MyClass myInstance; Observe the use of as part of the class name
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Class Templates oDefinition and Declaration If using header files, put the declaration and definition both in the header file. oTemplates 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.
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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
March 2006 Copyright, 2006 Oxford Consulting, Ltd 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 MyClass { ….. }
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Function and Class Templates o 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 functionMember (args) { function body } Class class className { class body };
March 2006 Copyright, 2006 Oxford Consulting, Ltd C++ Templates Function and Class Templates o Explicit Instantiation May wish to create a specific version of a function or class Function returnType functionName (args); Class class className