65.9K
CodeProject 正在变化。 阅读更多。
Home

初学者模板指南 - 第二部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.33/5 (11投票s)

2002 年 7 月 29 日

2分钟阅读

viewsIcon

88846

使用高级模板功能

引言

第一部分中,我们介绍了函数模板和类模板。 在本部分,我将向您展示可以使用模板完成的一些更有用的操作。

函数模板的重载

函数模板可以与其他函数模板以及普通函数一起被重载。 编译器将遍历可能的函数模板列表并创建适当的模板函数。 结果与其他可能的模板函数互补。 编译器会通过正常的重载函数来搜索最匹配的函数。

在模板中使用友元和模板

像第一部分中使用的类模板可以包含其他模板或类,也可以将其他类作为友元类。 当类模板包含另一个类时,有两种可能性

  • 第二个内部类可以是公共类。 因此,这个内部类也依赖于模板参数。 否则,内部类将再次成为类模板。
  • 外部类模板包含另一个依赖于外部类及其自身模板参数的模板。 在这个第一个例子中,我们将一些列表处理包含到类模板中
template < class ElemType >
class Tree
{
//...

public:
    class Node
    {
        friend Tree < ElemType >;
        //...
    };
};

在这里,内部类Node依赖于Tree,因此获得其参数。 外部类被定义为Nodefriend,并带有参数列表。

模板类型

在使用模板参数范围内声明的类型时,必须使用关键字typename声明它们

template < typename T >
class X
{
//...
    typename T::X theStuff; // T::X is the type
    //...
};

class Test
{
//...
    class X { /* ... */ };
};

如果不指定关键字typename,编译器会期望T::X是一个变量或常量,并返回一个错误!

元素模板

在使用元素模板时,可以例如创建一个公共类Builder来创建对象。 该类提供一个元素函数来分配自定义内存。 此元素函数将作为模板元素函数实现,可用于任何类型

class Builder
{
//...
    template < class T > static T* allocateMem();
};

注意:模板元素函数不能声明为virtual

最后...

我希望我能为您提供一个关于模板如何帮助您在开发项目时节省时间的简单概述。 请记住,它还可以为您节省大量的代码冗余和输入错误!

© . All rights reserved.