面向对象程序设计(基于C++)笔记5.26

一个是类型参数,一个是非类型参数

template<typename T, int i>

class Buffer

T v[i];

   int sz;

 public:

   Buffer():sz(i) { }

   …

 };

 Buffer<char,127> cbuf;

 Buffer<Record,8> rbuf;

!!!模板参数必须是常量

Example:

    void f(int i)

   {

     Buffer<int,i> bx; // Error

   }

函数模板:

例子:

template<typename T>

void Swap(T& x,T& y)

{

    T temp=x;  x=y;  y=temp;

}

template<typename T, typename Compare = std::less<T>>

void Sort(vector<T>& v)

{

    Compare cmp;     // make a default Compare object

    const size_t n = v.size();

    for (int gap=n/2; 0<gap; gap/=2)

        for (int i=gap; i<n; i++)

            for (int j=i-gap; 0<=j; j-=gap)

                if (cmp(v[j+gap],v[j]))

                    Swap(v[j],v[j+gap]);//希尔排序

}

struct No_case

{

    bool operator()(const string& a, const string& b) const;

    // compare case insensitive

};

函数模板和函数模板重载问题:

template<typename T>  

         T sqrt(T);

template<typename T>   

         complex<T> sqrt(complex<T>);

double sqrt(double);

void f (complex<double>  z)

{

        sqrt(2);            // sqrt<int>(int)

        sqrt(2.0);        // sqrt(double)

        sqrt(z);           // sqrt<double>(complex<double>)(特例化)

}

没有类型转换的普通函数优先级较高。

二异性错误:

template<typename T> T max(T, T);
const int s = 7;
void k()
{
max(1,2);     // max<int>(1,2)
max('a','b’);   // max<char>(’a’,’b’)
max(2.7,4.9);   // max<double>(2.7,4.9)
max(s,7);     // max<int>(int{s},7) (trivial conversion used)
max('a',1);       
  // error : ambiguous: max<char,char>() or max<int,int>()?
max(2.7,4); 
// error : ambiguous: max<double,double>() or max<int,int>()?
}

如果要调用就是显式调用 例如:max<int>('a',1)

specilation:

默认情况下,模板提供用于每个模板参数的单个定义 - 泛化。 也可以为特殊模板参数提供替代定义。这些定义称为用户专用化。

例子:

 template<typename T>

 class Vector {

   T* v; int sz;

 public:

   Vector();

   explicit Vector(int);

   T& elem(int);

   T& operator[](int);

   …

}; 

由于所有指针类型导致代码膨胀,最好使所有指针共享一个专用化。

 // specialization for argument type void*

 template<> class Vector<void*> {//完全特例化

   void** p; int sz;

 public:

   Vector();

   explicit Vector(int);

   void*& elem(int);

   void*& operator[](int);

   …

};

 // specializtion for any pointer argument

 template<typename T> class Vector<T*>

  : private Vector<void*> {//部分特例化

 public:

   typedef Vector<void*> Base;

   Vector():Base() { }

   explicit Vector(int i):Base(i){}

   T*& elem(int i) { return static_cast<T*&>(Base::elem(i));}

   T*& operator[](int i)

     { return     static_cast<T*&>(Base::operator[](i));}

   …

};

特例化其实就是为了减少代码膨胀

如果在通用模板使用很多数据类型,处理起来就比较泛泛.

特例化的定义必须在使用之前

template<typename T> class List;

// declare before any specializations

List<int*> li;   // error

template<typename T>

  class List<T*>

 {…};

一个特例化

template<typename T> class List;

// declare before any specializations

List<int*> li;   // error

template<typename T>

  class List<T*>

 {…};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NightHacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值