Class templates let a class store or return values without hard-coding one value type.

class template A class template defines a family of classes, such as `Box<int>` and `Box<std::string>`.

Class Templates

example
class_templates.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

template <typename T>
class Box {
private:
    T value;

public:
    Box(T initial) {
        value = initial;
    }

    T get() const {
        return value;
    }
};

int main() {
    int count = 4;
    std::string label = "crate";

    Box<int> countBox(count);
    Box<std::string> labelBox(label);

    std::cout << "count=" << countBox.get() << std::endl;
    std::cout << "label=" << labelBox.get() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
class Box {
private:
    T value;

public:
    Box(T initial) {
        value = initial;
    }

    T get() const {
        return value;
    }
};

int main() {
    int count = 1;
    std::string label = "crate";

    Box<int> countBox(count);
    Box<std::string> labelBox(label);

    std::cout << "count=" << countBox.get() << std::endl;
    std::cout << "label=" << labelBox.get() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
class Box {
private:
    T value;

public:
    Box(T initial) {
        value = initial;
    }

    T get() const {
        return value;
    }
};

int main() {
    int count = 9;
    std::string label = "crate";

    Box<int> countBox(count);
    Box<std::string> labelBox(label);

    std::cout << "count=" << countBox.get() << std::endl;
    std::cout << "label=" << labelBox.get() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
class Box {
private:
    T value;

public:
    Box(T initial) {
        value = initial;
    }

    T get() const {
        return value;
    }
};

int main() {
    int count = 4;
    std::string label = "box";

    Box<int> countBox(count);
    Box<std::string> labelBox(label);

    std::cout << "count=" << countBox.get() << std::endl;
    std::cout << "label=" << labelBox.get() << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
class Box {
private:
    T value;

public:
    Box(T initial) {
        value = initial;
    }

    T get() const {
        return value;
    }
};

int main() {
    int count = 4;
    std::string label = "bag";

    Box<int> countBox(count);
    Box<std::string> labelBox(label);

    std::cout << "count=" << countBox.get() << std::endl;
    std::cout << "label=" << labelBox.get() << std::endl;
    return 0;
}
  1. count ← 4, label ← crate, countBox ← (empty), labelBox ← (empty)

    19int main() {20    int count→ 4 = 4; //@count=1, 921    std::string label→ crate = "crate"; //@label="box", "bag"2223    Box<int> countBox→ (empty)(count4);24    Box<std::string> labelBox→ (empty)(labelcrate);2526    std::cout << "count=" << countBox(empty).get() << std::endl;27    std::cout << "label=" << labelBox(empty).get() << std::endl;28    return 0;29}
    outputcount=4
    label=crate
  1. count ← 1, label ← crate, countBox ← (empty), labelBox ← (empty)

    19int main() {20    int count→ 1 = 1;21    std::string label→ crate = "crate";2223    Box<int> countBox→ (empty)(count1);24    Box<std::string> labelBox→ (empty)(labelcrate);2526    std::cout << "count=" << countBox(empty).get() << std::endl;27    std::cout << "label=" << labelBox(empty).get() << std::endl;28    return 0;29}
    outputcount=1
    label=crate
  1. count ← 9, label ← crate, countBox ← (empty), labelBox ← (empty)

    19int main() {20    int count→ 9 = 9;21    std::string label→ crate = "crate";2223    Box<int> countBox→ (empty)(count9);24    Box<std::string> labelBox→ (empty)(labelcrate);2526    std::cout << "count=" << countBox(empty).get() << std::endl;27    std::cout << "label=" << labelBox(empty).get() << std::endl;28    return 0;29}
    outputcount=9
    label=crate
  1. count ← 4, label ← box, countBox ← (empty), labelBox ← (empty)

    19int main() {20    int count→ 4 = 4;21    std::string label→ box = "box";2223    Box<int> countBox→ (empty)(count4);24    Box<std::string> labelBox→ (empty)(labelbox);2526    std::cout << "count=" << countBox(empty).get() << std::endl;27    std::cout << "label=" << labelBox(empty).get() << std::endl;28    return 0;29}
    outputcount=4
    label=box
  1. count ← 4, label ← bag, countBox ← (empty), labelBox ← (empty)

    19int main() {20    int count→ 4 = 4;21    std::string label→ bag = "bag";2223    Box<int> countBox→ (empty)(count4);24    Box<std::string> labelBox→ (empty)(labelbag);2526    std::cout << "count=" << countBox(empty).get() << std::endl;27    std::cout << "label=" << labelBox(empty).get() << std::endl;28    return 0;29}
    outputcount=4
    label=bag