本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性

 

template(模板)

程序库中几乎所有东西都被设计成template形式。所谓templates,是针对“一个或多个尚未明确的型别”所撰写的函数或类别。

下面是一个典型例子

 template<class T>
 inline const T& max(const T& a,const T& b)
 {
      return a < b ? b : a;
 {

template并非一次编译便产生出社和所有型别的代码,而是针对被使用的某个(或某组)型别进行编译。因此你必须先提供它的某个实作品才能调用。

 

Nontype Templates参数(非型别模板参数)

型别(type)可作为template参数,非型别(nontype)也可以作为template参数。例如可以把标准类别bitset<>的bits数量以template参数指定。下面定义两个由bits构成的容器,分别为32个bits空间和50个bits空间。

bitset<32> flags32;
bitset<50> flags50;

 

Default Template Parameters(缺省模板参数)

Template classes可以有缺省参数。例如以下声明,允许你使用一个或两个template参数来声明MyClass对象。

template <class T,class container = vector<T> >
class MyClass;

 

关键字typename

关键字typename被用来作为型别之前的标识符号。考虑下面例子:

template <class T>
class MyClass
{
       typename T::SubType *ptr;
       ...
};

这里,typename指出SubType是class T中定义的一个型别,因此ptr是一个指向T::SubType型别的指针。

如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType *ptr会被解释为型别T内的数值SubType与ptr的乘积。

typename还可以在template声明中用来替代关键字class:

template <typename T>
class MyClass;

 

Member Template(成员模板)

class member function可以是个template,但这样的member template既不能是virtual,也不能有缺省参数,例如:

class MyClass
{
      ...
      template <class T>
      void f(T);
};

这里的MyClass::f声明了一个成员函数集,使用任何型别参数。这个特性通常用来为template classes中的成员提供自动型别转换。

如果使用类模板,其型别必须和调用端所提供的对象的型别完全吻合:

template <class T>
class MyClass
{
    private:
        T value;
    public:
        void assign(const MyClass<T>& x) {value=x.value;}
    ...  
};

void f()
{
     MyClass<double> d;
     MyClass<int> i;
     d.assign(d)            //OK
     d.assign(i)             //ERROR
}
View Code

相关文章:

  • 2021-08-30
  • 2022-12-23
  • 2021-04-01
  • 2022-12-23
  • 2022-01-07
  • 2021-05-16
  • 2022-12-23
  • 2021-10-27
猜你喜欢
  • 2022-01-13
  • 2022-02-16
  • 2021-06-27
  • 2021-10-22
  • 2021-07-28
  • 2021-08-31
  • 2021-12-14
相关资源
相似解决方案