zoukankan      html  css  js  c++  java
  • c++primer记录(二) 模板

    因为看得源码里有大量的类模板,所以补充下C++中模板的知识
    
    模板:函数模板  类模板                                                                                             
    
    1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出;
        
       p-551 非类型模板实参必须时编译时常量表达式,例: 
        template <int hi, int wid>
        class Screen
    {
        public: 
            Screen(int vhi, int vwid){} 
    };
        ====>Screen<24, 80> hp2621; 
    
    2、对于类模板,在外部实现成员函数时,需要加上
      
    //非特化  p-548   
        template < typename Type >
        class COMPARE 
    {
        public: 
            COMPARE(const Type&); 
    };
    template < typename Type >
    COMPARE<Type>::COMPARE(const Type& value){}
    
    //特化模板 p-568
        template <>
        class COMPARE<const char*>
    {
        public: 
            COMPARE(void);
    };
    COMPARE<const char*>::COMPARE(const char* const& value){}
    
    //特化成员函数 p-569
    template <>
    COMPARE<const char*>::COMPARE(const char* const& value){}
    
    
    3、类模板中的友员声明
    第一种:
        (1)非模板类   p-552
        (2)非模板函数 p-552
        template <typename Type> 
        class Bar
    {
        friend class FooBar;  //(1)非模板类
        friend void fcn();    //(2)非模板函数
    };
    
    第二种:
        (1)一般类模板         p-552
        (2)一般函数模板       p-552
        (3)类模板的特定实例   p-553
        (4)函数模板的特定实例 p-553
    ---------------------------------------------------------------------------
    (1)(2)
        template <typename Type> 
        class Bar
    {
        template <typename T> friend class Foo1; //(1)一般模板类
        template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
    };
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    (3)(4)
        template <typename T> class Foo2; //类模板声明
        template <typename T> void temp1_fcn2(const T&);//函数模板声明
        template <typename Type>
        class Bar
    {
        friend class Foo2<char*>;
        friend void temp1_fnc2<char*>(char* const &);
    };
    
    4、成员模板
        当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
        成员模板不能为需函数(为验证)
    
    5、函数模板的特化 
        template < typename Type >
        int compare(const Type &v1, const Type &v2)
        {
                return v1 < v2;
        }
    //特化函数模板
    //声明
        template <>
        int compare<const char*>(const char* const& v1, const char* const& v2);
    //实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
        template <>
        int compare<const char*>(const char* const& v1, const char*  const& v2)
        {
                std::cout << "speci " << v1 << "    " << v2 << std::endl;
                //  return v1 > v2;
                    return strcmp(v1, v2);
        }
    
    6、类模板的部分特化(此记录未验证)
        如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
        template < typename T1, typename T2>
        class some_template
    {
    };
    
    //类模板部分特化
    template < typename T1 >
    class some_template<T1, int>
    {
    };
    
    some_template<int, string>foo; //use template;
    some_tempalte<string, int>bar; //use partial specialization
    部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
    实例化类模板部分特化的成员 
    因为看得源码里有大量的类模板,所以补充下C++中模板的知识
    
    模板:函数模板  类模板                                                                                             
    
    1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出;
        
       p-551 非类型模板实参必须时编译时常量表达式,例: 
        template <int hi, int wid>
        class Screen
    {
        public: 
            Screen(int vhi, int vwid){} 
    };
        ====>Screen<24, 80> hp2621; 
    
    2、对于类模板,在外部实现成员函数时,需要加上
      
    //非特化  p-548   
        template < typename Type >
        class COMPARE 
    {
        public: 
            COMPARE(const Type&); 
    };
    template < typename Type >
    COMPARE<Type>::COMPARE(const Type& value){}
    
    //特化模板 p-568
        template <>
        class COMPARE<const char*>
    {
        public: 
            COMPARE(void);
    };
    COMPARE<const char*>::COMPARE(const char* const& value){}
    
    //特化成员函数 p-569
    template <>
    COMPARE<const char*>::COMPARE(const char* const& value){}
    
    
    3、类模板中的友员声明
    第一种:
        (1)非模板类   p-552
        (2)非模板函数 p-552
        template <typename Type> 
        class Bar
    {
        friend class FooBar;  //(1)非模板类
        friend void fcn();    //(2)非模板函数
    };
    
    第二种:
        (1)一般类模板         p-552
        (2)一般函数模板       p-552
        (3)类模板的特定实例   p-553
        (4)函数模板的特定实例 p-553
    ---------------------------------------------------------------------------
    (1)(2)
        template <typename Type> 
        class Bar
    {
        template <typename T> friend class Foo1; //(1)一般模板类
        template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
    };
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    (3)(4)
        template <typename T> class Foo2; //类模板声明
        template <typename T> void temp1_fcn2(const T&);//函数模板声明
        template <typename Type>
        class Bar
    {
        friend class Foo2<char*>;
        friend void temp1_fnc2<char*>(char* const &);
    };
    
    4、成员模板
        当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
        成员模板不能为需函数(为验证)
    
    5、函数模板的特化 
        template < typename Type >
        int compare(const Type &v1, const Type &v2)
        {
                return v1 < v2;
        }
    //特化函数模板
    //声明
        template <>
        int compare<const char*>(const char* const& v1, const char* const& v2);
    //实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
        template <>
        int compare<const char*>(const char* const& v1, const char*  const& v2)
        {
                std::cout << "speci " << v1 << "    " << v2 << std::endl;
                //  return v1 > v2;
                    return strcmp(v1, v2);
        }
    
    6、类模板的部分特化(此记录未验证)
        如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
        template < typename T1, typename T2>
        class some_template
    {
    };
    
    //类模板部分特化
    template < typename T1 >
    class some_template<T1, int>
    {
    };
    
    some_template<int, string>foo; //use template;
    some_tempalte<string, int>bar; //use partial specialization
    部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
    实例化类模板部分特化的成员 
  • 相关阅读:
    IE6不支持hover赋予css样式的解决方法 如div:hover li:hover支持
    导航条
    check的css样式
    css3网站
    时间轴滚动充盈
    html5网站
    图片查看插件
    响应式列表中控制图片高度一致js
    json数组按xxx属性值排序 升序
    H5响应式方案
  • 原文地址:https://www.cnblogs.com/openix/p/3143076.html
Copyright © 2011-2022 走看看