当前位置:首页 C++ > 正文

c++函数模板、类模板(含模板特化)

作者:野牛程序员:2024-01-03 15:06:34 C++阅读 2382

函数模板和类模板是 C++ 中用于实现泛型编程的重要特性。它们允许编写通用的代码,以便适用于多种数据类型而无需重复编写相似的代码。

函数模板(Function Templates):

// 函数模板示例
template <typename T>
T add(T a, T b) {
    return a + b;
}

// 函数模板的使用
int result1 = add(5, 10);        // 编译器会自动推导出 T 为 int
double result2 = add(3.14, 2.71); // 编译器会自动推导出 T 为 double

类模板(Class Templates):

// 类模板示例
template <typename T>
class Pair {
public:
    Pair(T first, T second) : first(first), second(second) {}

    T getFirst() const {
        return first;
    }

    T getSecond() const {
        return second;
    }

private:
    T first;
    T second;
};

// 类模板的使用
Pair<int> intPair(5, 10);        // 实例化 Pair 类模板,其中 T 被替换为 int
Pair<double> doublePair(3.14, 2.71); // 实例化 Pair 类模板,其中 T 被替换为 double

模板特化(Template Specialization):

// 模板特化示例
template <typename T>
class MyContainer {
public:
    MyContainer(T value) : value(value) {}

    void display() {
        std::cout << "General Template: " << value << std::endl;
    }

private:
    T value;
};

// 针对特定类型的模板特化
template <>
class MyContainer<std::string> {
public:
    MyContainer(std::string value) : value(value) {}

    void display() {
        std::cout << "Specialized Template for strings: " << value << std::endl;
    }

private:
    std::string value;
};

// 使用模板和模板特化
MyContainer<int> intContainer(42);
MyContainer<std::string> strContainer("Hello");

intContainer.display();   // 输出: General Template: 42
strContainer.display();   // 输出: Specialized Template for strings: Hello

这些例子展示了 C++ 中函数模板、类模板以及模板特化的基本用法。

#include <iostream>
#include <string>

// 函数模板示例
template <typename T>
T add(T a, T b) {
    return a + b;
}

// 类模板示例
template <typename T>
class Pair {
public:
    Pair(T first, T second) : first(first), second(second) {}

    T getFirst() const {
        return first;
    }

    T getSecond() const {
        return second;
    }

private:
    T first;
    T second;
};

// 模板特化示例
template <typename T>
class MyContainer {
public:
    MyContainer(T value) : value(value) {}

    void display() {
        std::cout << "General Template: " << value << std::endl;
    }

private:
    T value;
};

// 模板特化 - 针对 std::string 类型
template <>
class MyContainer<std::string> {
public:
    MyContainer(std::string value) : value(value) {}

    void display() {
        std::cout << "Specialized Template for strings: " << value << std::endl;
    }

private:
    std::string value;
};

int main() {
    // 函数模板的使用
    int result1 = add(5, 10);
    double result2 = add(3.14, 2.71);

    std::cout << "Function Template Results:" << std::endl;
    std::cout << "Result 1: " << result1 << std::endl;
    std::cout << "Result 2: " << result2 << std::endl;

    // 类模板的使用
    Pair<int> intPair(5, 10);
    Pair<double> doublePair(3.14, 2.71);

    std::cout << "\\nClass Template Results:" << std::endl;
    std::cout << "Int Pair: (" << intPair.getFirst() << ", " << intPair.getSecond() << ")" << std::endl;
    std::cout << "Double Pair: (" << doublePair.getFirst() << ", " << doublePair.getSecond() << ")" << std::endl;

    // 模板特化的使用
    MyContainer<int> intContainer(42);
    MyContainer<std::string> strContainer("Hello");

    std::cout << "\\nTemplate Specialization Results:" << std::endl;
    intContainer.display();
    strContainer.display();

    return 0;
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击