在C++中,template是一种通用编程工具,用于创建通用的函数或类。通过使用模板,可以编写可以应用于不同数据类型的函数或类,从而实现代码的重用性和灵活性。template的使用方法如下:

1. 函数模板(Function Templates)

函数模板允许定义一个通用的函数,可以在不同数据类型上进行操作。通过定义函数中的参数类型为模板参数,可以在函数调用时根据实际参数的类型来推断模板参数的类型。

以下是一个简单的函数模板示例:

template <typename T>
T maximum(T a, T b) {
    return (a > b) ? a : b;
}

在上面的代码中,template <typename T> 表示我们将要定义一个模板函数,T 是一个模板参数,它表示函数可以适用于不同的数据类型。maximum 函数接受两个类型为 T 的参数,并返回较大的那个。

可以使用以下方式调用函数模板:

int result1 = maximum(3, 5);        // 推断出模板参数为 int
double result2 = maximum(2.5, 1.8); // 推断出模板参数为 double

在上述示例中,函数模板根据实际参数的类型自动推断出模板参数的类型,并根据推断出的类型实例化函数。

2. 类模板(Class Templates)

类模板允许定义通用的类,可以在不同数据类型上进行实例化。与函数模板类似,通过在类中使用模板参数,可以在类的成员函数和成员变量中使用通用类型。

以下是一个简单的类模板示例:

template <typename T>
class Stack {
private:
    std::vector<T> elements;
public:
    void push(T element) {
        elements.push_back(element);
    }
    
    T pop() {
        T element = elements.back();
        elements.pop_back();
        return element;
    }
};

在上面的代码中,template <typename T> 表示我们将要定义一个模板类,T 是一个模板参数,它表示类可以适用于不同的数据类型。Stack 类可以存储不同类型的元素,并提供入栈和出栈操作。

可以使用以下方式实例化类模板:

Stack<int> intStack;
Stack<std::string> stringStack;

在上述示例中,intStack 是一个 Stack 类的实例,它可以存储 int 类型的元素;stringStack 是另一个 Stack 类的实例,它可以存储 std::string 类型的元素。

在实例化类模板时,需要在模板名称后面使用尖括号 <>,并在其中指定实际的类型。

3. 模板特化(Template Specialization)

模板特化允许为特定的类型提供自定义的实现。当通用的模板无法满足某种特定类型的需求时,可以通过模板特化来定义特定类型的行为。

以下是一个简单的函数模板特化示例:

template <typename T>
void printType(T value) {
    std::cout << "Type: " << typeid(value).name() << std::endl;
}

template <>
void printType<int>(int value) {
    std::cout << "Type: int" << std::endl;
}

在上述代码中,printType 函数是一个通用的模板函数,用于打印参数的类型。然后,我们定义了一个特化版本,用于处理 int 类型的参数。特化版本通过 template <> 开始,并指定要特化的类型。

可以使用以下方式调用函数模板及其特化版本:

printType("Hello"); // 输出:Type: char const *
printType(123);     // 输出:Type: int (使用特化版本)

在上述示例中,通过调用 printType("Hello"),通用版本的函数模板被调用;而通过调用 printType(123),特化版本的函数模板被调用。

类模板也可以进行特化,特化的语法与函数模板类似。

总结:template 可以用于定义通用的函数或类,并使其在不同数据类型上工作。可以通过函数模板和类模板来实现通用编程,而模板特化提供了对特定类型的自定义实现。