Oracle Solaris Studio 12.2:C++ 用户指南

6.1 函数模板

函数模板描述了仅用参数或返回值的类型来区分的一组相关函数。

6.1.1 函数模板声明

使用模板之前,请先声明。以下示例中的声明提供了使用模板所需的足够信息,但没有提供实现模板所需的足够信息。


template <class Number> Number twice( Number original );

在此示例中,Number模板参数,它指定模板描述的函数范围。更具体地说,Number模板类型参数,在模板定义中使用它表示确定的模板使用位置处的类型。

6.1.2 函数模板定义

如果要声明模板,请先定义该模板。定义提供了实现模板所需的足够信息。以下示例定义了在前一个示例中声明的模板。


template <class Number> Number twice( Number original )
    { return original + original; }

因为模板定义通常出现在头文件中,所以模板定义必须在多个编译单元中重复。不过所有的定义都必须是相同的。该限制称为一次定义规则

6.1.3 函数模板用法

声明后,模板可以像其他函数一样使用。它们的使用由命名模板和提供函数参数组成。编译器可以从函数参数类型推断出模板类型参数。例如,您可以使用上面声明的模板,具体步骤如下所示。


double twicedouble( double item )
    { return twice( item ); }

如果模板参数不能从函数参数类型推断出,则调用函数时必须提供模板参数。例如:


template<class T> T func(); // no function arguments
int k = func<int>(); // template argument supplied explicitly