美文网首页
★07.关于类模板

★07.关于类模板

作者: iDragonfly | 来源:发表于2017-06-30 22:16 被阅读0次

简述

  • 类模板:是类类型的模板,如:vector
  • 模板类:类模板的实例化,如:vector<int>
  • 类模板的模板参数无法通过模板参数自动推断来确定,必须显式指定。

定义

类模板的定义和声明必须放在头文件中

template<typename T>
class A {
public:
    A();
    void fun1();
    void fun2() {}   // 定义在模板内部
};

template<typename T>
A<T>::A() {
}

template<typename T>
void A<T>::fun1() {
}

特化

代码

template <typename T>
class A {
public:
    A() { std::cout << "A<T>" << std::endl; }
};

template <>
class A<double> {
public:
    A() { std::cout << "A<double>" << std::endl; }
};

int main() {
    A<int> a1;
    A<double> a2;
    return system("pause");
}

输出结果

A<T>
A<double>

特化成员函数

template <typename T>
class A {
public:
    void fun() {
        std::cout << "A<T>::fun()" << std::endl;
    }
};

// 只特化类模板的部分成员
template <>
void A<int>::fun() {
    std::cout << "A<int>::fun()" << std::endl;
}

前置声明与友元声明

// 前置声明不需要给出模板参数
template <typename> class A1;
template <typename> class A2;


template <typename T>
class B {
public:
    friend class A1<T>;                      // 一对一友元关系
    friend class A2<int>;                    // 多对某一友元关系
    template <typename> friend class A3;     // 多对多友元关系,也有前置声明的作用
};

// 类模板的特化
template <>
class B<int> {
public:
    friend class A2<int>;                    // 某一对某一友元关系
    template <typename> friend class A3;     // 某一对多友元关系,也有前置声明的作用
};

可以省略模板实参的情况

template <typename T>
class A {
public:
    // 类模板作用域内可以直接使用类模板名字而不必提供模板参数
    // 即模板作用域内直接使用类模板名A时,编译期会解读为A<T>
    A fun1(A a) {
        A b;
        return b;
    }

    A fun2(A a);
};

// 类模板作用域外不可以直接使用类模板名A取代A<T>
template <typename T>
A<T> A<T>::fun2(A a) {
    // 类模板成员函数的形参列表及其函数体属于类模板作用域内
    A b;
    return b;
}

模板类型别名

template <typename T> using name1 = pair<T, T>;
template <typename T> using name2 = pair<T, char>;

int main() {
    name1<int> t1;          // t1是一个pair<int, int>
    name2<int> t2;          // t2是一个pair<int, char>
    return system("pause");
}

使用模板参数的类型成员

class A {
public:
    typedef int value_type;
};

template <typename T>
class B {
public:
    typedef typename T::value_type type;

    typename T::value_type fun() {
        return typename T::value_type();
    }
};

默认模板实参

template <typename T = int, typename F = double>
class A {
};

int main() {
    A<> a1;                 // A<int, double>
    A<double> a2;           // A<double, double>
    A<string, string> a3;   // A<string, string>
    return system("pause");
}

显式实例化

显式实例化类模板时会显式实例化其所有成员。

// 显式实例化的作用是避免编译器多次重复实例化啊,可以达到加快编译速度的效果
// 下述代码不能同时出现在一个文件中
template class A<int>;                // 定义,代表在此处将类模板A实例化为A<int>
extern template class A<int>;         // 声明,代表承诺在别的文件中有个A<int>实例化

相关文章

  • ★07.关于类模板

    简述 类模板:是类类型的模板,如:vector。 模板类:类模板的实例化,如:vector 。 类模板的模板参数无...

  • 14/12

    成员模板:模板类中成员变量是模板类对象(1),模板类中函数是模板函数(2)

  • 14/15

    约束模板友元 模板类的外边定义一个模板函数,在模板类中将模板函数具体化为模板类的友元函数 非约束模板友元 模板类中...

  • GEEKBAND STL第一周

    关于模板库 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成...

  • 读书笔记:《学会写作》-模板写作、新媒体写作

    继续《学会写作》的阅读。 “模板写作”第一节作者给出了四类实用的模板:通知类模板、分析类模板、计划类模板和总结类模...

  • 模板方法模式

    模板抽象类 模板抽象类实现类 使用

  • 模板与泛型 —— using 定义模板别名

    一、类的成员函数模板 二、using 定义模板别名 一、类的成员函数模板 普通类和模板类,其成员函数都可以是模板函...

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 慕课网-C++远征之模板篇(上)-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 类模板和模板类

    我是一个不喜欢看定义的人,我个人觉得知道怎么用就行了,这是一种糟糕的表现,可能是快节奏的的社会,让我做出的选择。从...

网友评论

      本文标题:★07.关于类模板

      本文链接:https://www.haomeiwen.com/subject/fdoicxtx.html