template之模板中class与typename区别

前言

在分析traits编程之前, 我们需要对模板参数类型tempnameclass有一定的了解, 要明白他们在哪些方面不同, 哪些方面相同, 这样才能对体会到traits编程的核心. 如果你已经明白了两者, 那么你可以直接看下一篇了.

相同之处

一般对模板参数类型typenameclass认为是一样的. 这两者在参数类型中确实是一样的. 你可以写成

template<class T> 
class point {};

也可以写成

template<typename T>
class point {};

这两者都是一样的, 没有区别. 两者typenameclass参数类型中没有不同

既然相同又为什么定义这两个符号呢?

  1. 最开始定义定义模板的方法就是template<class T> , 但是class毕竟都认为是一个类, 在使用时难免会有些点混淆, 也就定义了typename来标志参数类型
  2. 最重要关于 typename可以使用嵌套依赖类型, 也就是类型可以嵌套使用. 这也是两个的不同之处.

不同之处

typename可以用在嵌套依赖中, 并且表示其类型, 而class并没有这样的功能.

什么是嵌套依赖? 我们以一个简单的实例来看

template<class T>
class people
{
	public:
		typedef T	value_type;
		typedef T*	pointer;
		typedef T&	reference;
};

template<class T>
struct man 
{
	public:
		typedef typename T::value_type	value_type;
		typedef typename T::pointer		pointer;
		typedef typename T::reference	reference;
		void print()
		{
			cout << "man" << endl;
		}
};

int main()
{
	man<people<int>> Man;
	Man.print();

	exit(0);
}

以上就是typename的嵌套使用. typename告诉编译器这不是一个函数, 也不是一个变量而是一个类型. 这里使用typedef又将参数类型重新定义一次, 1. 增加了一层间接性, 2. 使用的时候也不需要在写很长的代码.

这里typename是对people类中定义的类型进行了一次提取, 这里将typename改为class就会出错.

typename主要的作用:

  • 对于模板参数是类的时候, typename能够提取出该类所定义的参数类型.

并不是所有的嵌套依赖类型都要加上typename, 有一个例外 : 当继承列表或成员初始化列表中对基类进行初始化的时候, 可以去掉typename关键字

man(int x) : T::value_type(x) {}

总结

这里对typename做了一个浅显的分析, 这也足够我们可以分析traits编程的基础了. 我再将以上的分析做一个归纳.

  1. typenameclass在作为参数类型时用法一样, 没有区别
  2. typename主要用于对嵌套依赖类型进行提取(萃取). 而class没有这样的功能.
  3. typename提取的一个例外是在继承或成员初始化列表中对基类进行初始化时不用加typename关键字
  • 29
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值