因为看得源码里有大量的类模板,所以补充下C++中模板的知识模板:函数模板 类模板 1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出; p-551 非类型模板实参必须时编译时常量表达式,例: templateclass 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 ::COMPARE(const Type& value){}//特化模板 p-568 template <> class COMPARE { public: COMPARE(void);};COMPARE ::COMPARE(const char* const& value){}//特化成员函数 p-569template <>COMPARE ::COMPARE(const char* const& value){}3、类模板中的友员声明第一种: (1)非模板类 p-552 (2)非模板函数 p-552 template 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 class Bar{ template friend class Foo1; //(1)一般模板类 template friend void temp1_fcn1(const T&); //(2)一般函数模板};------------------------------------------------------------------------------------------------------------------------------------------------------(3)(4) template class Foo2; //类模板声明 template void temp1_fcn2(const T&);//函数模板声明 template class Bar{ friend class Foo2 ; friend void temp1_fnc2 (char* const &);};4、成员模板 当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板 成员模板不能为需函数(为验证)5、函数模板的特化 template < typename Type > int compare(const Type &v1, const Type &v2) { return v1 < v2; }//特化函数模板//声明 template <> int compare (const char* const& v1, const char* const& v2);//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了 template <> int compare (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 {};some_template foo; //use template;some_tempalte bar; //use partial specialization部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来实例化类模板部分特化的成员
因为看得源码里有大量的类模板,所以补充下C++中模板的知识模板:函数模板 类模板 1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出; p-551 非类型模板实参必须时编译时常量表达式,例: templateclass 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 ::COMPARE(const Type& value){}//特化模板 p-568 template <> class COMPARE { public: COMPARE(void);};COMPARE ::COMPARE(const char* const& value){}//特化成员函数 p-569template <>COMPARE ::COMPARE(const char* const& value){}3、类模板中的友员声明第一种: (1)非模板类 p-552 (2)非模板函数 p-552 template 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 class Bar{ template friend class Foo1; //(1)一般模板类 template friend void temp1_fcn1(const T&); //(2)一般函数模板};------------------------------------------------------------------------------------------------------------------------------------------------------(3)(4) template class Foo2; //类模板声明 template void temp1_fcn2(const T&);//函数模板声明 template class Bar{ friend class Foo2 ; friend void temp1_fnc2 (char* const &);};4、成员模板 当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板 成员模板不能为需函数(为验证)5、函数模板的特化 template < typename Type > int compare(const Type &v1, const Type &v2) { return v1 < v2; }//特化函数模板//声明 template <> int compare (const char* const& v1, const char* const& v2);//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了 template <> int compare (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 {};some_template foo; //use template;some_tempalte bar; //use partial specialization部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来实例化类模板部分特化的成员