类模板继承和部分具体化例子及非类型参数

简介: 模板类必须所有的方法定义放到一个文件中。因为模板类不是函数不能单独编译 template class myext:public mybase 模板定义两个类型参数T1,T2,定义个非类型参数T3,他在使用期间如同一个常数。
模板类必须所有的方法定义放到一个文件中。因为模板类不是函数不能单独编译

template<typename T1,typename T2,int T3>
class myext:public mybase<T2>
模板定义两个类型参数T1,T2,定义个非类型参数T3,他在使用期间如同一个常数。这个T3可以用来处理动态数组,并且继承了模板类mybase并且将类型参数T2赋予给他
template<typename T2,int T3>
class myext<int,T2,T3>:public mybase<T2>
模板定义一个类型参数T2,定义一个非类型参数T3,那么这里的T2就代表他是泛型的,而不具体化,但是开始的T1变为了具体化的int, 并且继承了模板类mybase并且将类型参数T2赋予给他

template<typename T1,typename T2,int T3>
void myext<T1,T2,T3>::set(const T1 &in)
这是第一个模板类定义方法的方法

template<typename T2,int T3>
void myext<int,T2,T3>::set(const int &in)
这是第二个模板类定义方法的方法

调用:
myext<string,string,4> test2("test","gaopeng"); 将匹配 template<typename T1,typename T2,int T3>  class myext:public mybase<T2>
myext<int,int,10> test1(1,1); 将匹配 template<typename T2,int T3>  class myext<int,T2,T3>:public mybase<T2>
具体化过后当然选择的方法是选择匹配程度最高的模板。
下面是具体的测试代码没有实际意义:


点击(此处)折叠或打开

  1. 头文件
  2. tmp.h
  3. #include<iostream>
  4. using namespace std;

  5. template<typename T1>
  6. class mybase
  7. {
  8.         private:
  9.                 T1 a;
  10.         public:
  11.                 mybase(T1 in)
  12.                 {
  13.                         a=in;
  14.                 }
  15.                 virtual void show(void) const
  16.                 {
  17.                         cout<<a<<endl;
  18.                 }
  19.                 virtual ~mybase(){}
  20. };

  21. template<typename T1,typename T2,int T3>
  22. class myext:public mybase<T2>
  23. {
  24.         private:
  25.                 T1 b;
  26.         public:
  27.                 myext(T1 in1,T2 in2):mybase<T2>(in2)
  28.         {
  29.                 b=in1;
  30.         }
  31.                 virtual void show(void) const
  32.                 {
  33.                         for(int i=0;i<T3;i++)
  34.                         cout<<b<<endl;
  35.                         mybase<T2>::show();
  36.                 }
  37.                 virtual ~myext(){}

  38.                 virtual void set(const T1&);
  39. };

  40. template<typename T1,typename T2,int T3>
  41. void myext<T1,T2,T3>::set(const T1 &in)
  42. {
  43.         b=in;
  44.         for(int m=0;m<T3;m++)
  45.         {
  46.                 cout<<"test"<<endl;
  47.         }
  48. }

  49. template<typename T2,int T3>
  50. class myext<int,T2,T3>:public mybase<T2>
  51. {
  52.         private:
  53.                 int b;
  54.         public:
  55.                 myext(int in1,T2 in2):mybase<T2>(in2)
  56.         {
  57.                 b=in1+100;
  58.         }
  59.                 virtual void show(void) const
  60.                 {
  61.                         for(int i=0;i<T3;i++)
  62.                                 cout<<b<<endl;
  63.                         mybase<T2>::show();
  64.                 }
  65.                 virtual ~myext(){}
  66.                 virtual void set(const int&);
  67. };
  68. template<typename T2,int T3>
  69. void myext<int,T2,T3>::set(const int &in)
  70. {
  71.         b=in+100;
  72.         for(int m=0;m<T3;m++)
  73.         {
  74.                 cout<<"test1"<<endl;
  75.         }
  76. }


点击(此处)折叠或打开

  1. main函数

  2. #include<iostream>
  3. #include"tmp.h"
  4. using namespace std;


  5. int main(void)
  6. {
  7.         cout<<"use specialization template"<<endl;
  8.         myext<int,int,10> test1(1,1);
  9.         test1.set(10);
  10.         test1.show();
  11.         cout<<"use general template"<<endl;
  12.         myext<string,string,4> test2("test","gaopeng");
  13.         test2.show();
  14. }
输出:
use specialization template
test1
test1
test1
test1
test1
test1
test1
test1
test1
test1
110
110
110
110
110
110
110
110
110
110
1
use general template
test
test
test
test
gaopeng

目录
打赏
0
0
0
0
91
分享
相关文章
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
74 2
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
类与对象(三)--构造函数体中的赋值和初始化列表的区别
类与对象(三)--构造函数体中的赋值和初始化列表的区别
|
9月前
|
JavaSE——面向对象高级三(4/5)-认识泛型、定义泛型类、定义泛型接口
JavaSE——面向对象高级三(4/5)-认识泛型、定义泛型类、定义泛型接口
50 0
类模板和继承
类模板和继承
62 0
多态性的使用举例
多态性的使用举例
57 0
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(二)
本章将正式开始介绍C++中的模板,为了能让大家更好地体会到用模板多是件美事!我们将会举例说明,大家可以试着把自己带入到文章中,跟着思路去阅读和思考,真的会很有意思!如果你对网络流行梗有了解,读起来将会更有意思!
162 1
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(二)
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(一)
本章将正式开始介绍C++中的模板,为了能让大家更好地体会到用模板多是件美事!我们将会举例说明,大家可以试着把自己带入到文章中,跟着思路去阅读和思考,真的会很有意思!如果你对网络流行梗有了解,读起来将会更有意思!
149 0
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(一)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
227 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等