CppPrimer笔记 Chapter16 模板与泛型编程

CppPrimer笔记 Chapter16 模板与泛型编程

标签: Cpp



定义模板(16.1)

  • 定义函数模板(为什么以下调用了函数版本二?)
using namespace std;
template <typename T>
int compare(const T&v1, const T&v2)
{
    cout << "compare1";
    if (v1 < v2){
  return -1;}
    if (v2 < v1){
  return 1;}
    return 0;
}
template<unsigned N, unsigned M>
int compare(const char(&p1)[N], const char(&p2)[M])
{
    cout << "compare2";
    return strcmp(p1, p2);
}
template <typename T,typename M>
int compare(const T&v1, const M&v2)
{
    cout << "compare3";
    if (v1 < v2){
  return -1;}
    if (v2 < v1){
  return 1;}
    return 0;
}
int main()
{
    cout<<compare("mom2", "mom");
}
  • 非类型模板参数的模板实参必须是常量表达式
  • 函数模板与类模板成员函数定义通常放在头文件中(调用一个普通函数时,编译器只需要掌握函数的声明.而必须掌握函数模板或类模板成员的定义)
  • 一个类模板的每个示例都形成一个独立的类.之间为各自独立的类
  • 在类模板自己的作用域中我们可以直接使用模板名而不提供实参.
  • 在类模板外使用类模板名
  • 类模板与友元
    有三种关系:(代码中给出例子与详细解释)
    • 建立对应实例及其友元间的友好关系
    • 将另一个模板的每一个实例都声明为自己的友元
    • 限定特定的实例为友元
    • 令模板自己的类型参数成为友元

**建立对应实例及其友元间的友好关系
即BlobPtr只能是Blob的友元,而不是Blob的友元,对于==来说也是这样**


template <typename> class BlobPtr;
template <typename> class Blob;//运算符==中的参数所需要的
template <typename T>
bool operator==(const Blob<T>&, const Blob<T>&);
template <typename T> class Blob
{
    //每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相等运算符
    friend class BlobPtr<T>;
    friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
};

一个类将限定特定的实例为友元,如下 只有Pal是 C的友元,Pal就不是

template <typename T>class Pal;
class C//C是一个普通的非模板类
{
    friend class Pal<C>;//用类C实例化的Pal是C的一个友元
    //Pal的所有实例都是C的友元
    template <typename T> friend class Pal2;
};

**将另一个模板的每一个示例都声明为自己的友元
即Pal可以访问C,C2的所有实例,比如C C C2
此时 友元声明中必须使用与类模板本身不同的模板参数,见代码L7**

template <typename T> class C2//C2本身是一个类模板
{
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值