Tutorials Logic, IN info@tutorialslogic.com
Navigation
Home About Us Contact Us Blogs FAQs
Tutorials
All Tutorials
Services
Academic Projects Resume Writing Website Development
Practice
Quiz Challenge Interview Questions Certification Practice
Tools
Online Compiler JSON Formatter Regex Tester CSS Unit Converter Color Picker
Compiler Tools

C++ Templates Function Class Templates: Tutorial, Examples, FAQs & Interview Tips

What are Templates?

Templates are C++'s mechanism for generic programming. They let you write a function or class once and have the compiler generate type-specific versions automatically. This eliminates code duplication while maintaining full type safety.

  • Function templates - generic functions that work with any type.
  • Class templates - generic classes (like std::vector<T>).

Function Templates

Function Templates
#include <iostream>
#include <string>
using namespace std;

// Function template - T is a placeholder for any type
template <typename T>
T maxOf(T a, T b) {
    return (a > b) ? a : b;
}

// Template with multiple type parameters
template <typename T, typename U>
void printPair(T first, U second) {
    cout << first << " : " << second << endl;
}

// Template specialization - custom behaviour for a specific type
template <>
string maxOf<string>(string a, string b) {
    return (a.length() > b.length()) ? a : b;  // longer string wins
}

int main() {
    cout << maxOf(3, 7)         << endl;  // 7 (int)
    cout << maxOf(3.14, 2.71)   << endl;  // 3.14 (double)
    cout << maxOf('z', 'a')     << endl;  // z (char)
    cout << maxOf<string>("Hi", "Hello") << endl;  // Hello (longer)

    printPair("Name", "Alice");
    printPair("Age",  30);
    printPair(3.14,   true);

    return 0;
}

Class Templates

Generic Stack using Class Template
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;

template <typename T>
class Stack {
private:
    vector<T> data;

public:
    void push(const T &item) {
        data.push_back(item);
    }

    T pop() {
        if (empty()) throw runtime_error("Stack is empty");
        T top = data.back();
        data.pop_back();
        return top;
    }

    T& peek() {
        if (empty()) throw runtime_error("Stack is empty");
        return data.back();
    }

    bool empty() const { return data.empty(); }
    size_t size() const { return data.size(); }
};

int main() {
    // Stack of ints
    Stack<int> intStack;
    intStack.push(10);
    intStack.push(20);
    intStack.push(30);
    cout << "Top: " << intStack.peek() << endl;  // 30
    cout << intStack.pop() << endl;  // 30
    cout << intStack.pop() << endl;  // 20

    // Stack of strings - same class, different type
    Stack<string> strStack;
    strStack.push("Hello");
    strStack.push("World");
    cout << strStack.pop() << endl;  // World

    return 0;
}

Ready to Level Up Your Skills?

Explore 500+ free tutorials across 20+ languages and frameworks.