Source files (for downloading):
template < generic_type_list > // fctn def using types given in generic_type_list
where generic_type_list is a comma separated list of items of the form typename name (or class name)
// Templated function: minimum // Requires < to be defined for type T template <typename T> const T & minimum(const T & x, const T & y) { return (x < y) ? x : y; } // Templated function: swapIt // Requires operator= to be defined for type T template <typename T> void swapIt(T & x, T & y) { T temp; temp = x; x = y; y = temp; }
int x1 = 5, y1 = 9; double x2 = 3.2, y2 = 9.7; string s1("hello"), s2("goodbye"); cout << minimum(x1, y1) << endl; cout << minimum<double>(x2, y2) << endl; cout << minimum(s1, s2) << endl; swapIt(x1, y1); swapIt(x2, y2); swapIt(s1, s2); cout << "After swapIt, x1 = " << x1 << ", y1 = " << y1 << endl; cout << "After swapIt, x2 = " << x2 << ", y2 = " << y2 << endl; cout << "After swapIt, s1 = " << s1 << ", s2 = " << s2 << endl;
template <typename Object> class ObjectWrapper { public: ObjectWrapper(const Object & initValue = Object() ) : value(initValue) { } const Object & getValue() const { return value; } void setValue( const Object & newValue ); private: Object value; }; template <typename Object> void ObjectWrapper<Object>::setValue( const Object & newValue ) { value = newValue; }
ObjectWrapper<int> obj1(8); ObjectWrapper<double> obj2(3.14); ObjectWrapper<string> obj3(s2); obj1.setValue(2); obj3.setValue(s1);
template <typename KeyType, typename ValueType> class Map { ... };
template <typename T> const T & minimum(const T & x, const T & y) { return (x < y) ? x : y; } template <> const double & minimum<double>(const double & x, const double & y) { // do something special for doubles }
Template nontype parameters template <typename Object, int size> class Buffer { ... private: Object buf[size]; }; // in another file: Buffer<string, 1024> buffer1; Buffer<string, 2048> buffer2;