• 类和函数的泛化、偏特化和全特化


    一、类模板的泛化、偏特化和全特化 

    1.类模板的泛化

    1. //类模板
    2. template<class T1,class T2>
    3. class People
    4. {
    5. public:
    6. void func(T1 a, T2 b)
    7. {
    8. cout << "(T1 a, T2 b)" << endl;
    9. }
    10. };
    11. int main(int argc, char** argv) {
    12. People<int,bool> p1;
    13. p1.func(12, true);
    14. system("pause");
    15. return 0;
    16. }

    2.类模板的偏特化(个数的偏特化)

            上面对主版本模板和全特化进行了定义,那么偏特化就是介于二者之间的模板,它的模板名与主版本模板名相同,但是它的模板型中,有被明确化的部分和没有被明确化的部分。那么这个类就叫做偏特化类

    注意:偏特化的条件:1.必须有一个主模板   2.模板类型被部分明确化

    1. //先声明类模板
    2. template<class T1,class T2> class People;
    3. //类的偏特化
    4. template<class T1>
    5. class Peopleint> {
    6. public:
    7. void func(T1 a, int b)
    8. {
    9. cout << "(T1 a, int b)" << endl;
    10. }
    11. };
    12. int main(int argc, char** argv) {
    13. People<bool,int> p2;
    14. p2.func(true, 12);
    15. system("pause");
    16. return 0;
    17. }

    3.类模板的偏特化(范围的偏特化)

    注意:偏特化的条件:1.必须有一个主模板   2.模板类型被部分明确化 

    1. //本来T1可以是任意类型,现在范围类型缩小为指针类型
    2. template<class T1>
    3. class Peopleint> {
    4. public:
    5. void func(T1* a, int b)
    6. {
    7. cout << "(T1* a, int b)" << endl;
    8. }
    9. };
    10. int main(int argc, char** argv)
    11. {
    12. People<char*,int> p3;
    13. p3.func(const_cast<char*>(string("Hello,World!").c_str()), 12);
    14. system("pause");
    15. return 0;
    16. }

    4.类模板的全特化

            特化其实就是特殊化的意思,在模板类里,所有的类型都是模板(template),而一旦我们将所有的模板类型T都明确化,并且写了一个类名与主模板类名相同的类,那么这个类就叫做全特化类。C++模板全特化之后已经失去了Template的属性了。

    注意:一个模板被称为全特化的条件:1.必须有一个主模板类  2.模板类型被全部明确化

    1. //先声明类模板
    2. template<class T1,class T2> class People;
    3. //类的全特化
    4. template<>
    5. class People<double, int> {
    6. public:
    7. void func(double a, int b)
    8. {
    9. cout << "(double a, int b)" << endl;
    10. }
    11. };
    12. int main(int argc, char** argv) {
    13. People<double, int> p4;
    14. p4.func(12.34, 12);
    15. system("pause");
    16. return 0;
    17. }

    二、函数的泛化、偏特化和全特化

    1. 函数模板(泛化)

    1. //模板函数
    2. template<typename T, typename N> void func(T num1, N num2)
    3. {
    4. cout << "num1:" << num1 << ", num2:" << num2 <
    5. }

    2. 函数的偏特化(个数的偏特化)

    1. //模板函数
    2. template<typename T, class N> void func(T num1, N num2)
    3. {
    4. //cout << "num1:" << num1 << ", num2:" << num2 <
    5. }
    6. //偏特化,模板函数
    7. template<typename T> void funcint>(T num1, int num2)
    8. {
    9. cout << "num1:" << num1 << ", num2:" << num2 <
    10. }

    3. 函数的偏特化(范围的偏特化)

    1. //模板函数
    2. template<typename T, class N> void func(T num1, N num2)
    3. {
    4. //cout << "num1:" << num1 << ", num2:" << num2 <
    5. }
    6. //偏特化,模板函数
    7. template<typename T> void funcint>(T* num1, int num2)
    8. {
    9. cout << "num1:" << num1 << ", num2:" << num2 <
    10. }

    4. 函数的全特化

    1. //模板函数
    2. template<typename T, class N> void func(T num1, N num2)
    3. {
    4. //cout << "num1:" << num1 << ", num2:" << num2 <
    5. }
    6. //全特化,模板函数
    7. template<> void func<double, int>(double num1, int num2)
    8. {
    9. cout << "num1:" << num1 << ", num2:" << num2 <
    10. }

    三、模板类的调用优先级

            对主版本模板类、全特化类、偏特化类的调用优先级从高到低进行排序是:全特化类>偏特化类>主版本模板类】。这样的优先级顺序对性能也是最好的。

            但是模板特化并不只是为了性能优化,更多是为了让模板函数能够正常工作,最典型的例子就是STL中的iterator_traits。algorithm中大多数算法通过iterator对象来处理数据,但是同时允许以指针代替iterator对象,这是为了支持C-Style Array。如果直接操作iterator,那么为了支持指针类型,每个函数都需要进行重载,因为指针没有::value_type类型。为了解决这个问题,STL使用了iterator_traits,并为指针类型进行转化,算法通过它来操作iterator,不需要知道实际操作的是iterator对象还是指针。

    1. template<typename IteratorClass> class iterator_traits
    2. ...
    3. template<typename ValueType> class iterator_traits
    4. ...
    5. template<typename ValueType> class iterator_traitsconst*>
    6. ...

  • 相关阅读:
    PostGreSQL:时间戳时区问题
    如何免费给PDF文件添加标注?
    trident-java使用
    Android gradient 三色渐变背景 Shap
    FSCTF 2023(公开赛道)CRYPTO WP
    Vue多级路由的实现
    12、DML总结:(添加,修改,删除数据)
    图扑软件数字孪生海上风电 | 向海图强,奋楫争先
    第四章 网络层 | 计算机网络(谢希仁 第八版)
    Java计算不同时区的时差
  • 原文地址:https://blog.csdn.net/weixin_43712770/article/details/126012294