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 部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来 实例化类模板部分特化的成员