zoukankan      html  css  js  c++  java
  • 成员模板和参数模板

    1. 成员模板    

         为了实现STL(标准模板库)的设计。模板可以用作结构,类或模板类的成员。如实例1,定义模板类beta,包含成员数据即模板类hold定义的对象 q,n。成员函数包括模板函数func。头文件包含以下两种模板类定义方法,第一是类中定义。另一种是类外定义。

      实例1 成员模板实例

    代码:

    结果:
        
    分析:

       1.成员模板类或者成员模板函数作为模板类成员(类型参数T),在定义的时候,可以把模板类的类型参数视作已知“类型”,然后在这个“非模板”的类使用模板类或者模板函数。这样分析比较方便。
       2.成员模板函数的类型隐式实例化。
       3.模板类外定义成员模板类或模板函数,并不是所有的编译器都支持。定义的时候,应该使用作用域说明符“::”,表明模板类和模板函数的成员身份。且嵌套说明模板参数。

    2. 参数模板     

         从使用的角度,倘若模板类作为类型参数,即模板的类型参数本身是一个带类型参数的模板类。举例如下:

    template<template<template T> class Thing>
    class gamma

           其中,template<template T> class为类型,Thing为参数。例如,可以声明这样的对象:
    gamma<beta> g;

           也就是说,模板类包含某些对象,这些成员对象是实例化模板类beta得到。

      见如下代码:

    #define flag
    #ifdef flag
    template< template<typename T> class Thing  >
    class gamma{
    	Thing<int> a;
    	Thing<double> b;
    public:
    	gamma(){}
    	gamma(int x=0,double y=0,int c1=0,int c2=0):a(c1,x),b(c2,y){}//注意c1,c2的缺省值
    	void show()
    	{a.show();b.show();}
    };
    #endif
           模板类型参数是实例1中声明和定义的模板类bata。

       可以这样实例化对象:

    gamma<beta> p(1,2.34,5,6);
        实际上,可以混合使用模板参数和常规参数。声明如下:
    template<template<typename T> class Thing,template U,template V>
    class alpha{
    	Thing<U>  a;
    	Thing<V>  b;
    public:
         .......};
            这时,成员a,b为泛型而不是上例中硬编码制定类型int和double。当然对象声明也应该更改为:
     alpha<beta,int,double>




  • 相关阅读:
    Object-c NSArray
    内存管理池
    Objuct-c 对象的初始化 存起器 属性 self和super 内存管理
    继承什么的
    Object C 多态性
    Objectvie
    (重点) 协议
    分类
    一张图了解Python
    转载 MySql常用查询语句(23种)
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393151.html
Copyright © 2011-2022 走看看