A while ago I discovered generics in Java. Today, I’m going to explore how to do the same with C++.

Generics in C++ are known as templates. We use the keyword template to tell the compiler that we are about to define one:

1
2
template <typename T>
class Hello {};

In the example above, you can also see that typename is used to define the type. You might also see the keyword class used interchangeably (There are some scenarios where they are not interchangeable, but I’m not going to cover those in this article):

1
2
template <class T>
class Hello {};

I’ll use typename in my examples, so it isn’t confused with a class definition.

Simple example

A very simple example of a template could be used to store an instance of a type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
class OneElement {
 public:
  void set(T element) {
    element_ = element;
  }

  T get() {
    return element_;
  }

 private:
  T element_;
};

The template could be used like this:

1
2
3
4
5
6
int main() {
  OneElement<int> myElement;
  myElement.set(5);

  std::cout << "The element has: " << myElement.get();
}

Multiple types

You can use more than a single type in a template, you just need to use different names for each type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <typename A, typename B>
class TwoElements {
 public:
  void setFirst(A first) {
    first_ = first;
  }

  void setSecond(B second) {
    second_ = second;
  }

  A getFirst() {
    return first_;
  }

  B getSecond() {
    return second_;
  }

 private:
  A first_;
  B second_;
};

And can be used like this:

1
2
3
4
5
6
7
8
int main() {
  TwoElements<int, std::string> myElements;
  myElements.setFirst(3);
  myElements.setSecond("Tacos");

  std::cout << "I ate " << myElements.getFirst() << " "
            << myElements.getSecond() << std::endl;
}

Conclusion

Creating simple templates is not very complicated. We just need to tell the compiler we want to create a template and name the types we are going to use. Templates can become pretty complicated in some occasions, but I’ll not cover those scenarios here.

[ c++  programming  ]
Concurrent data structures
Pointers to members in C++
Operator overloading in C++
C++ value categories
Exception handling in C++