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
部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
实例化类模板部分特化的成员 
原文地址:https://www.cnblogs.com/openix/p/3143076.html