跳至主要內容

26.C++模板

约 259 字小于 1 分钟

函数模板

template <typename T, typename U>
void printPair(T a, U b) {
    cout << a << " and " << b << endl;
}
 
int main() {
    printPair(1, "hello"); // 编译器能够推导T为int,U为const char*
    printPair<int>("test", 100); // 必须显式指定其中一个模板参数
}

类模板

template <typename T> 
class ClassName {
   // 成员变量和方法使用模板参数T
};
#include <iostream>
#include <vector>

template <typename T>
class Stack {
private:
    std::vector<T> data; // 使用 vector 存储元素
public:
    void push(const T& value) { // 压栈
        data.push_back(value);
    }

    void pop() { // 出栈
        if (!data.empty()) {
            data.pop_back();
        } else {
            std::cerr << "Stack is empty!\n";
        }
    }

    T top() const { // 获取栈顶元素
        if (!data.empty()) {
            return data.back();
        } else {
            throw std::out_of_range("Stack is empty!");
        }
    }

    bool empty() const { // 判断栈是否为空
        return data.empty();
    }

    size_t size() const { // 获取栈大小
        return data.size();
    }
};

int main() {
    Stack<int> intStack; // 创建存储 int 类型的栈
    intStack.push(10);
    intStack.push(20);
    intStack.push(30);

    std::cout << "栈顶元素: " << intStack.top() << std::endl;
    intStack.pop();
    std::cout << "栈顶元素(出栈后): " << intStack.top() << std::endl;

    Stack<std::string> stringStack; // 创建存储 string 类型的栈
    stringStack.push("Hello");
    stringStack.push("World");
    
    std::cout << "字符串栈顶元素: " << stringStack.top() << std::endl;

    return 0;
}