## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# 8.11. Writing a Class Template

## Problem

You have a class whose members need to be different types in different situations, and using conventional polymorphic behavior is cumbersome or redundant. In other words, as the class designer, you want a class user to be able to choose the types of various parts of your class when he instantiates it, rather than setting them all in the original definition of the class.

## Solution

Use a class template to parameterize types that can be used to declare class members (and much more). That is, write your class with placeholders for types; thus, leaving it to the user of the class template to choose which types to use. See Example 8-12 for an example of a tree node that can point to any type.

Example 8-12. Writing a class template

`#include <iostream> #include <string> using namespace std; template<typename T> class TreeNode { public: TreeNode(const T& val) : val_(val), left_(NULL), right_(NULL) {} ~TreeNode() { delete left_; delete right_; } const T& getVal() const {return(val_);} void setVal(const T& val) {val_ = val;} void addChild(TreeNode<T>* p) { const T& other = p->getVal(); if (other > val_) if (right_) right_->addChild(p); else right_ = p; else if (left_) left_->addChild(p); else left_ = p; } const TreeNode<T>* getLeft() {return(left_);} const TreeNode<T>* getRight() {return(right_);} private: T val_; TreeNode<T>* left_; TreeNode<T>* right_; }; int main() { TreeNode<string> node1("frank"); TreeNode<string> node2("larry"); TreeNode<string> node3("bill"); ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required