c++primer——模板,标准库特殊设施

本文深入探讨了C++中的模板与内联函数的概念、定义与使用方法,包括模板的实例化、非类型模板、类模板、可变参数模板、包扩展、模板特例化、tuple类型与bitset类等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.模板:

函数模板的定义:编译器会根据实例化推断模板类型参数

template<typename T>//以template开始的,用尖括号表示模板参数列表.类型参数前必须加class和typename,且两者无差别
bool less(const T &a,const T &b)//函数体
{ 
         if(a<b)  return true;
         return false;
}
实例化:less(2,1);

非类型模板定义:

template<unsigned int N, unsigned int M>
int  com(const char (&p1)[N],const char(&p2)[M] )
{
	return strcmp(p1,p2);
}
我们在实例化这个模板时:com("hi","mom");编译器会自动识别字符数组,并且在末尾加‘\0’结束符,所以这里的N=3,M=4

注意:绑定到非类型模板的实参一定是常量,或者是静态数据。

2.关键字:inline,在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。这个只是为了提高效率,具体参见http://blog.sina.com.cn/s/blog_90e888f50100zgo2.html,感觉讲的很详细。只有函数体本身比较小,又经常被用到才会使用内联函数。

关键字inline与模板类结合的定义为:template<typename T> inline T min(const T &,const T &);//正确

inline template<typename T>  T min(const T &,const T &);//错误。
3.类模板:编译器无法根据实例化推断模板类型参数

定义:template<typename T> class blob{}

4.可变参数模板:

template<typename T,typename ....args>//告诉编译器有不定个模板参数

void foo(const T &t,const Args&..........);//

编译器会在实例化时从左到右依次判断有多少个参数包,我们可以用sizeof...(args)来求出函数参数的数目。

5.包扩展

template<typename T,typename ....args>

ostream &//备注需要扩展的类型

print(ostream &os,const T &t,const Args &)

{

//函数体。

}

6.模板特例化:

template<>

int com(const char*const &p1,const char* const &p2)

{

return strcmp(p1,p2);

}

模板特例化是为了让传过来是字符串的话就直接调用这个特例化的版本。

7.tuple类型:这个是标准库中的,包含在头文件#include<tuple>中,类似于pair和vector,只是pair规定的是两个成员数目,而tuple可以有任意个成员数目。

具体介绍看下http://blog.youkuaiyun.com/fjb2080/article/details/15809097

8.bitset类:二进制位来进行操作的,包含在头文件#include <bitset>具体介绍看下面链接:

http://blog.163.com/lixiangqiu_9202/blog/static/53575037201251121331412/

9.正则表达式:http://blog.sina.com.cn/s/blog_ac9fdc0b0101oow9.html

10.虚基类:解决基类多个继承的问题,如下:

class CBase { };
class CDerive1:virtual public CBase{ };
class CDerive2:virtual public CBase{ };
class CDerive12:public CDerive1,CDerive2{ };
则在类CDerive12的对象中,仅有类CBase的一个对象数据

基类的特点:

       虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承);
       虚基类的构造函数先于非虚基类的构造函数执行。

具体查看http://blog.youkuaiyun.com/caomiao2006/article/details/4463664


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值