C++箴言:理解typename的两个含义

问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?

template<class T> class Widget; // uses "class"
template<typename T> class Widget; // uses "typename"


答案:没什么不同。在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西。一些程序员更喜欢在所有的时间都用 class,因为它更容易输入。其他人(包括我本人)更喜欢 typename,因为它暗示着这个参数不必要是一个 class type(类类型)。少数开发者在任何类型都被允许的时候使用 typename,而把 class 保留给仅接受 user-defined types(用户定义类型)的场合。但是从 C++ 的观点看,class 和 typename 在声明一个 template parameter(模板参数)时意味着完全相同的东西。

然而,C++ 并不总是把 class 和 typename 视为等同的东西。有时你必须使用 typename。为了理解这一点,我们不得不讨论你会在一个 template(模板)中涉及到的两种名字。

假设我们有一个函数的模板,它能取得一个 STL-compatible container(STL 兼容容器)中持有的能赋值给 ints 的对象。进一步假设这个函数只是简单地打印它的第二个元素的值。它是一个用糊涂的方法实现的糊涂的函数,而且就像我下面写的,它甚至不能编译,但是请将这些事先放在一边——有一种方法能发现我的愚蠢:

template<typename C> // print 2nd element in
void print2nd(const C& container) // container;
{
 // this is not valid C++!
 if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
 }
}


我突出了这个函数中的两个 local variables(局部变量),iter 和 value。iter 的类型是 C::const_iterator,一个依赖于 template parameter(模板参数)C 的类型。一个 template(模板)中的依赖于一个 template parameter(模板参数)的名字被称为 dependent names(依赖名字)。当一个 dependent names(依赖名字)嵌套在一个 class(类)的内部时,我称它为 nested dependent name(嵌套依赖名字)。C::const_iterator 是一个 nested dependent name(嵌套依赖名字)。实际上,它是一个 nested dependent type name(嵌套依赖类型名),也就是说,一个涉及到一个 type(类型)的 nested dependent name(嵌套依赖名字)。

时间: 2024-11-03 21:44:17

C++箴言:理解typename的两个含义的相关文章

社区电商包含了两层含义,即社区电子商务和社区化的电子商务

社区电商包含了两层含义,即社区电子商务和社区化的电子商务.社区电子商务是基于社区的基础上开展电子商务,而社区化的电子商务,是在围绕电子商务的平台如何研究把这个电子商务做的社区化. 从主流方向来看,互联网商务将来的两个发展方向,一是社区化,一是规模化.社区化是纵向的,规模化是横向的.而社区电商的这两种特性兼而有之(传统电商只解决了规模化问题),电子商务解决突破区域限制的规模化问题代表的是线上(Online)的特性,而社区化是扎根于区域,代表的是线下(Offline)的特性.在移动网购高速增长下,原

软件架构设计箴言理解

     今天和师弟聊天聊到他们项目开发,有些同事总是提前考虑性能优化,需求变更又是一大堆的重写,让我想起了Donald Knuth 提到的:对软件的过早地优化是万恶的根源.这里就简单的说几条重要的软件名人哲学. 1:软件中唯一不变的就是变化.      在软件开发过程中需求是不停的变化,随着客户对系统的认识,和现有开发功能和软件的认识,也许以开始他提出的需求就是背离的.记得网上有一句笑话,师说需求变化的:   程序员XX遭遇车祸成植物人,医生说活下来的希望只有万分之一,唤醒更为渺茫.可他的Le

深入理解双指针的两种用法_C 语言

好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻.于是,从网上找资料,学习了一番--题目是这样的: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num); //

Re:从零开始的领域驱动设计

领域驱动的火爆程度不用我赘述,但是即便其如此得耳熟能详,但大多数人对其的认识,还只是停留在知道它的缩写是DDD,知道它是一种软件思想,或者知道它和微服务有千丝万缕的关系.Eric Evans对DDD的诠释是那么地惜字如金,而我所认识的领域驱动设计的专家又都是行业中的资深前辈,他们擅长于对软件设计进行高屋建瓴的论述,如果没有丰富的互联网从业经验,是不能从他们的分享中获取太多的营养的,可以用曲高和寡来形容.1000个互联网从业者,100个懂微服务,10个人懂领域驱动设计. 可能有很多和我一样的读者,

聂君:企业信息安全建设的思考

0x00 安全观安全 安全的本质 在企业做信息安全会遇到很多困惑,企业信息安全到底应该怎么做?管理.技术.流程还是人更重要?安全团队和安全人才该怎么建设培养和激励?带着这些问题参加了很多安全峰会,虽然有很多不错的会议和演讲者分享了很多体会,但相比之下,更多的会议和演讲者的做法还是不太专业.常见的套路:开篇讲一堆的安全事件,什么热讲什么:中篇讲所谓解决方案或思路,大部分代表其背后的利益团体,要么产品,要么先思路后产品:然后草草结尾.PPT做的很互联网,罗列的数据很多,可是没有讲清楚,中篇的方案或思

C/C++:如何理解复杂的声明

http://blog.chinaunix.net/u/12783/showart_378340.html   C/C++:如何理解复杂的声明 这里说的声明,不光适用于C/C++,其他的一些语言也能适用. 与java和C#等不同,声明和定义在C/C++中有着比较明显的区别:声明仅仅是介绍名字(introduce names),而定义则会为该名字分配相应的空间.打个通俗的比喻:声明就是你在谈话中提到某个人的名字,而定义就是把你提到的这个人带到谈话的人群中来,让大家见识一下他/她是什么样子. 这里主

Java初学者都必须理解的六大问题

初学|问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列. 问题一:我声明了什么! String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是"Hello world!".这样模糊的回答通常是概念不清的根源.如果要准确的回答,一半的人大概会回答错误. 这个语句声明的

王施帆:新手该如何理解“内容为王 外链为皇”

今天是中秋节,先祝福A5工作人员以及所有站长朋友中秋愉快.阖家幸福."内容为王,外链为皇"这句话,相信SEOER们都听说过,也理解其中的含义.这篇文章主要是写给一些新手,像王施帆一样的菜鸟SEO,让这些新手真正的理解这句话的含义.接下来,我从两方面去通俗的解释这句话,望有所帮助! 宝宝的成长. 昨天晚上,陪朋友去超市买点火锅配菜,打算提前过个中秋节,因为她们明天要回家了.当我无意间逛到宝宝奶粉专架的时候,听到几个年轻的妈妈在说:"奶粉再好,再安全,宝宝不高兴,它还是不吃的!&

理解PHP中的Session及对Session有效期的控制_php技巧

0.什么是session?       Session的中文译名叫做"会话",其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.目前社会上对session的理解非常混乱:有时候我们可以看到这样的话"在一个浏览器会话期间,...",这里的会话是指从一个浏览器窗口打开到关闭这个期间:也可以看到"用户(客户端)在一次会话期间"这样一句话,它可能指用户的一系列动作(一般情况下是