因为看得源码里有大量的类模板,所以补充下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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/92519
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!