JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

6.1 函数模板

6.1.1 函数模板声明

6.1.2 函数模板定义

6.1.3 函数模板用法

6.2 类模板

6.2.1 类模板声明

6.2.2 类模板定义

6.2.3 类模板成员定义

6.2.3.1 函数成员定义

6.2.3.2 静态数据成员定义

6.2.4 类模板的用法

6.3 模板实例化

6.3.1 隐式模板实例化

6.3.2 显式模板实例化

6.3.2.1 模板函数的显式实例化

6.3.2.2 模板类的显式实例化

6.3.2.3 模板类函数成员的显式实例化

6.3.2.4 模板类静态数据成员的显式实例

6.4 模板组合

6.5 缺省模板参数

6.6 模板专门化

6.6.1 模板专门化声明

6.6.2 模板专门化定义

6.6.3 模板专门化使用和实例化

6.6.4 部分专门化

6.7 模板问题部分

6.7.1 非本地名称解析和实例化

6.7.2 作为模板参数的本地类型

6.7.3 模板函数的友元声明

6.7.4 在模板定义内使用限定名称

6.7.5 嵌套模板名称

6.7.6 引用静态变量和静态函数

6.7.7 在同一目录中使用模板生成多个程序

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

6.6 模板专门化

将某些模板参数组合视为一个特殊的参数可以提高性能,如本节中的 twice 示例所示。另外,模板说明对于它的一组可能参数也可能不起作用,如本节中的 sort 示例所示。模板专门化允许您定义实际模板参数给定组合的可选实现。模板专门化覆盖了缺省实例化。

6.6.1 模板专门化声明

使用模板参数的组合之前,您必须声明专门化。以下示例声明了twicesort 的专用实现。

template <> unsigned twice<unsigned>( unsigned original );
template <> sort<char*>(Array<char*> store);

如果编译器可以明确决定模板参数,则您可以省略模板参数。例如:

template <> unsigned twice(unsigned original);
template <> sort(Array<char*> store);

6.6.2 模板专门化定义

必须定义声明的所有模板专门化。下例定义了上一节中声明的函数。

template <> unsigned twice<unsigned>(unsigned original)
    {return original << 1;}
#include <string.h>
template <> void sort<char*>(Array<char*> store)
    {int num_elems = store.GetSize();
      for (int i = 0; i < num_elems-1; i++)
          for (int j = i+1; j < num_elems; j++)
              if (strcmp(store[j-1], store[j]) > 0)
                  {char *temp = store[j];
                    store[j] = store[j-1];
                    store[j-1] = temp;}}

6.6.3 模板专门化使用和实例化

专门化与其他任何模板一样使用并实例化,除此以外,完全专用模板的定义也是实例化。

6.6.4 部分专门化

在前一个示例中,模板是完全专用的。也就是说,模板定义了特定模板参数的实现。模板也可以部分专用,这意味着只有某些模板参数被指定,或者一个或多个参数被限定到某种类型。生成的部分专门化仍然是模板。例如,以下代码样例说明了主模板和该模板的完全专门化。

template<class T, class U> class A {...}; //primary template
template<> class A<int, double> {...};    //specialization

以下代码说明了主模板部分专门化的示例。

template<class U> class A<int> {...};          // Example 1
template<class T, class U> class A<T*> {...};  // Example 2
template<class T> class A<T**, char> {...};    // Example 3