学习《C++ Templates 中文版》第一部分 第3章、第4章

第三章学习笔记:

1.类模板   和函数模板很相似的

template <typename T> 

class stack{  

};

注:那么这个类的类型是stack<T> 一些对赋值,拷贝构造函数等要像这样

template <template T》

class stack{

  stack(stack<T> const&);

  stack<T>& operator=(stack<T> const&);

};

stack<T>& stack(stack<T>::operator=(stack<T> const&){

}

当然,用类名而不是类的类型的时候,就只要stack即可。

2.类的成员函数实现    指定成员函数是一个函数模板  就需要使用该类模板的完整类型限定符 故要这样写:

template <typename T>

void stack(stack<T>::pop(){

}


模板类的参数是模板类类型,那么唯一要求是两个靠在一起的 '>'  之间 留一个空格.

stack<stack<int> >  

错误写法: stack<stack<int>>   编译器会认为>> 会编译错误。


3.类模板的特化

① 和函数模板的重载类似,优化基于某种类型 实现。。。

② 要特化一个类模板, 还要特化该类的所有成员函数。

特化例子:

template<>

class stack<std::string>{

}

进行类模板的转化时,每个成员函数 重新定义为普通函数。特化后的话,使用的话不变吧?


函数也可以单独特化:


#include <iostream>
#include <string>
#include <algorithm>

template<typename value_t>
value_t const& max(value_t  const& valueA, value_t const& valueB){
    std::cout << "generic template used. ";
    return valueA > valueB ? valueA :valueB;
}

template<>
std::string const & max<std::string>(std::string const & s1, std::string const & s2){    // the point!
    std::cout << "specified template used ^_^. ";
    std::string s1Temp(s1);
    std::string s2Temp(s2);
    std::transform(s1Temp.begin(), s1Temp.end(), s1Temp.begin(), tolower);
    std::transform(s2Temp.begin(), s2Temp.end(), s2Temp.begin(), tolower);
    return s1Temp > s2Temp ? s1 : s2;
}

template<>
int const & max<int>(int const&  s1, int const& s2){    // the point!
   std::cout << "AAA ";
    return s1 > s2 ? s1 : s2;
}

int main(){
    try{
        //std::string s1(getUserInput("A"));
        //std::string s2(getUserInput("B"));
        std::string s1(("aaa"));
        std::string s2(("BBB"));
        std::cout << "the bigger is:" << ::max(1, 2);
    }
    catch(...){ std::cerr << "\n*** exception ! ***\n";}
    return 0;
}

红色代码要注意  函数模板里的参数类型 和 特化的函数类型格式要一样俄。否则会还是用函数模板要实例化出函数代码的。 不会使用已经特化的。





4.局部转化:

如:template <typename T1, typename T2>

class myclass<T1*, T2*>{

};

貌似这个模板局部特化在VC6.0是不支持的。


5.缺省模板实参:(哇,强大)

与C++普通函数的缺省方式是一样一样的。这些缺省值还可引用之前的模板参数

如:

template <typename T, typename CONT=std::vector<T> >





小结:

参看原文。



第四章学习笔记

非类型模板参数:

限制有点多,具体是:

非类型模板的参数里有限制:不能是浮点数和类对象。

通常只能是:常整数 或 指向外部(extern)对象的指针

PDF电子书下载地址:http://download.csdn.net/detail/helihui123/3719798


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

helihui123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值