📜  模板和默认参数(1)

📅  最后修改于: 2023-12-03 15:26:51.449000             🧑  作者: Mango

模板和默认参数

在编写程序时,有时候我们需要定义一些通用的代码或函数,然后在不同的地方调用它们,这时候就可以使用模板。另外,如果我们在定义函数时,希望某些参数具有默认值,这时候就可以使用默认参数。

模板

模板(template)是一种通用的代码或函数,可以用不同的数据类型进行参数化,从而实现在不同的地方重复使用相同的代码逻辑。模板特化(template specialization)则是在特定的数据类型情况下,独立实现某个模板的过程。

定义模板

在C++中,我们使用template关键字来定义模板。模板的语法格式如下:

template <typename Type>
Type function(Type x, Type y) {
    return x + y;
}

其中,typename Type是模板参数,Type是类型参数名(可以理解为变量名),也可以用class来代替typename。这里我们定义了一个名为function的函数模板,其参数类型均为Type类型,并返回Type类型。函数体中使用了参数x和y,它们的类型就是Type类型。

使用模板

我们可以在调用模板时,指定Type为某种具体的数据类型,例如:

function<int>(3, 4);  // 7

在这个例子中,我们调用了function模板,指定Type为int类型,然后传入两个int类型的参数3和4,预期会得到7。

模板特化

模板特化是站在模板的角度下对某一种或几种特定数据类型做出具体的实现。对于特定类型,如果我们希望使用与通用模板不同的实现,就可以使用模板特化。

模板特化的语法格式如下:

template <>
Type function<Type>(Type x, Type y) {
    return x * y;
}

这里我们为int类型的特定实现,重新定义了名为function的函数模板,其参数类型均为int类型,返回值是两数之积。这样,在调用function函数时,如果参数类型为int类型,就会使用这个特定实现了。

默认参数

默认参数是函数定义时,为某些参数指定默认值。当函数调用时不指定这些参数的值时,就会使用默认值。

定义默认参数

在C++中,我们可以在函数定义时为参数指定默认值,例如:

int add(int a, int b = 0) {
    return a + b;
}

这里我们定义了一个名为add的函数,其中b参数指定了默认值为0。调用add函数时,如果只传入一个参数,那么默认值0就会被使用。

使用默认参数

我们可以在调用函数时,只传入部分参数,而没有传入默认参数。例如:

add(3);  // 3

在这个例子中,我们只传入参数3,而没传入b参数,这时候默认值0就会被使用,函数返回3。

示例

下面是一个示例程序,其中实现了模板和默认参数的使用:

#include <iostream>

template <typename Type>
Type add(Type a, Type b) {
    return a + b;
}

template <>
double add<double>(double a, double b) {
    return a * b;
}

int add(int a, int b = 0) {
    return a - b;
}

int main() {
    std::cout << add(3, 4) << std::endl;  // -1
    std::cout << add(3) << std::endl;     // 3
    std::cout << add(3.0, 4.0) << std::endl;  // 12
    return 0;
}

在这个示例程序中,我们定义了一个名为add的函数模板,以及一个特定实现(用于double类型)。另外,我们还定义了一个名为add的函数,其中使用了默认参数。在程序中,我们分别调用了三个add函数,并输出了函数返回值。