C++模板编程与泛型编程之类模板、变量模板、别名模板(三)

缺省参数


  • 常规缺省参数
    • 类型模板参数缺省值的规矩:如果某个模板参数有缺省值,那么从这个有缺省值的模板参数开始,后面的所有模板参数都得有缺省值。
  • 案例1:
//TC的泛化版本
//template <typename T,typename U>
template <typename T=int, typename U=int>
struct TC
{
	TC()
	{
		cout << "TC泛化版本的构造函数" << endl;
	}
	void functest1()
	{
		cout << "functest1泛化版本" << endl;
	}
};
  • 调用:
TC<> mytc5;         //使用了缺省模板参数,所以<>中啥也不用提供
TC<double> mytc6;   //<>中第一个类型不使用缺省参数,第二个类型使用缺省参数
  • 输出:
TC泛化版本的构造函数
TC泛化版本的构造函数

  • 常规缺省参数
    • 类模板片特化版本中的类型模板参数不可以有缺省值。

//TC的特化版本
//template <typename T = char>   //报错
template <typename T>
struct TC<T, int>
{

};

  • 后面的模板参数依赖前面的模板参数
template <typename T,typename U = T*>
struct TC
{
	//....
};
  • 调用:
TC<double> mytc5;
TC<double,int> mytc6;
  • 可以给一个参数,后面一个参数则为double *;

  • 在模板声明中指定缺省参数
//声明1,指定了V和W
template <typename T,typename U, typename V = int,typename W = char>
struct TC;

//声明2,指定U
template <typename T, typename U = char, typename V, typename W>
struct TC;

//定义泛化版本的TC
template <typename T, typename U, typename V, typename W>
struct TC
{
	//...
};
  • 调用:
TC<int> mytc;
  • 第二、三、四个模板参数采用缺省值,所以<>里只提供了一个类型模板实参

类型别名

  • 考虑到类型名比较长,所以 一般都用typedef ,或者using给这些类型名起一个额外的别名来简化书写。
  • C++11开始支持using这种用法,建议使用using
typedef TC<int, float> IF_TC;
using IF_TCU = TC<int, float>;
  • 使用:
IF_TC mytc10
IF_TCU mytc1
  • IF_TC等价于TC<int, float> ,所以整个代码行等价于:TC<int, float>   mytc10;
  • IF_TCU等价于TC<int, float> 

非类型模板参数

//template <typename T , typename U ,size_t arrsize=8>
template <typename T, typename U, auto arrsize = 8>
struct TC
{
	T m_arr[arrsize]; 
	void functest2();
};
//template <typename T, typename U, size_t arrsize>
template <typename T, typename U, auto arrsize>
void TC<T,U, arrsize >::functest2()
{
	cout << "functest2泛化版本" << endl;
}

  • :这个arrsize是在编译器期间,编译器就会传递进来arrsize的大小来确定数组m_arr的大小。
  • 调用:
TC<double, double> mytc30; //缺省的第三个模板参数是8
for (size_t i = 0; i < 8; ++i)
{
	mytc30.m_arr[i] = static_cast<double>(i);
}
cout << mytc30.m_arr[7] << endl;       //7

TC<double, double, 18> mytc31;
mytc31.m_arr[10] = 16.8;
cout << mytc31.m_arr[10] << endl;     //16.8
  • 数值是常量。类型一般也限制在整型、指针类型等等。(参见函数模板)

  • 全局指针不能作为函数参数,可改为使用数组
template <const char *p>
struct TC2
{
	TC2()
	{
		printf("TC2::TC2执行了,p= %s\n", p);
	}
};
//const char* g_s = "hello"; //全局指针,调用会报错
const char g_s[] = "hello";
  • 调用:
TC2<g_s>  mytc40;
  • 显示结果:


  • 字符串常量也无法作为模板参数 
    • 针对上面的模板进行如下调用,编译器报错。:
TC2<"hello"> mytc41;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值