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

模板类必须所有的方法定义放到一个文件中。因为模板类不是函数不能单独编译

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

时间: 2024-07-29 07:46:59

类模板继承和部分具体化例子及非类型参数的相关文章

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C++中的类模板详解及示例_C 语言

C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: 复制代码 代码如下: class Compare_int{ public:  Compare(int a,int b)  {   x=a;   y=b;  }   int max()  {   return (x>y)?x:y;  }  int min()  {   return (x<y)?x:y;  } private:  int x,y;}; 其作用是

继承-C++,类模板作为基类派生及指针的问题。

问题描述 C++,类模板作为基类派生及指针的问题. **C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下.我是初学者,勿喷啊!** 以下面例子为例.C++的. #include<iostream> using namespace std; template<class T1> class A { protected: T1 a; public: virtual void output1(); virtual void

qt-自己定义的类MyItem控件继承于QGraphicsWidgt类,该如何布局求例子。

问题描述 自己定义的类MyItem控件继承于QGraphicsWidgt类,该如何布局求例子. 自己写了一个myItem:QGraphicsWidgetd的控件,现在想在main.cpp中完成布局,布局的样式就是顶部一个MyItem控件,下面是垂直分布的.两边可以添加控件这种样式 求大神讲解下 阿里嘎多.目前自己研究的是利用了QGraphicsLinearLayout. 解决方案 http://www.it165.net/pro/html/201308/6703.html

ThinkPHP v3.1.2版本模板继承的功能说明

模板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载. 因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块. 每个区块由<block></block>标签组成,并且不支持block标签的嵌

Python 进阶_OOP 面向对象编程_类和继承

目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类属性方法的命名规则 类 类是实例的抽象, 实例是类的具体化. Python 中的类分为 经典类 和 新式类. 前者现在已经很少用到了, 其特点就是可以不需要继承任何父类:后者则刚好相反, 形式类必须至少有一个父类, 如果没有特定的父类需要继承时, 至少需要继承基类 object, 在后面给出例子.

解密ThinkPHP3.1.2版本之模板继承_php实例

模板继承是ThinkPHP3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载. 因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块. 每个区块由<block></block>标签组成,并且不支持b

C++类模板的三种特化

说起C++的模板及模板特化,相信很多人都很熟悉,但是说到模板特化的几种类型,相信了解的人就不是很多.我这里归纳了模板特化的几种类型,一是特化为绝对类型:而是特化为引用,指针类型:三是特化为另外一个模板类. 这里用一个简单的例子来说明这三种情况: // general version template<class T> class Compare { public: static bool IsEqual(const T& lh, const T& rh) { return lh

用auto_ptr类模板帮助动态内存管理

动态内存使用最多的是在C++应用程序的代码中.有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出.当异常被掷出时,程序的正常控制流程被改变,因此导致潜在的内存溢出.例如, void g() //可能掷出 { if (some_condition == false) throw X(); } void func() { string * pstr = new string; g(); //如果 g 掷出一个异常,内存溢出 delete pstr;