跳至主要内容

template template parameter

挺拗口的,不过TTP其实只是模板参数的进一步抽象。就像指针,指向指针的指针那样,这个比喻可能不太恰当,不过大概是这个意思啦。
下面的代码定义了一个模板类,第一个模板参数是接受类型的参数,第二个是接受模板类型的参数。
template <typename T, template <typename ELEM> class CONT = std::deque>
class Stack {
private:
CONT
<T> elems;
public:

}
;
单独将第二个参数提取出来看,template <> class CONT 只是一个很平常的模板,这便是定义一个模板类型的模板参数的语法,因为只是为了说明CONT是个模板,所以ELEM可以省去,即template class CONT,就算加上了,ELEM也不能当作类型使用,这实际上是一个dummy参数。有人要问了,typename能省吗?这可不行,template<> class CONT是实例化的模板,template class CONT是模板定义,两者不同。所以啦,为了让std::deque参数能直接写成std::deque,绕了这么一大圈。
虽然typename与class在template参数定义中常常等价,
但是template class CONT = std::deque> 是有效的,
而template typename CONT = std::deque>是无效的,会引起编译错误。
为什么呢?因为CONT被定义为模板,而模板需要实例化才能使用,即CONT。这么用的多半是class,而且我们在Stack定义中也是这么实现的,如此一来,typename便使得类型匹配处引起编译错误了,虽然不知道是否会出现可以使用typename的情况,书中确实提到Template template parameters for function templates are not allowed,看起来似乎只能使用class关键字。
不过上面的代码在使用时仍然不能通过编译,因为TTP的类型匹配不会使用默认参数,因此,对标准库的deque而言,第二个带默认值的参数allocator是必须明确定义的,不然类型不匹配。于是代码改成下面这样:
template <typename T,
template
<typename ELEM,
typename ALLOC
= std::allocator<ELEM> > class CONT = std::deque>
class Stack {

}
;
这里ALLOC同样是可以省略的。
...头有点大了,还慢慢学吧

评论

此博客中的热门博文

反转剧

这两天明显感到天气转冷,呱呱的家里也已经下起了大雪,南京则是阴冷潮湿,让人没有了出行的欲望。没想到躲在被子里看反转剧也成了度过寒冬的一剂良药。在PPLive越来越让人失望的时候,PPStream横空出世,虽然广告仍是少不了的主题,但从视频质量和播放连续性上来说都超过PPLive,实为居家必备之良品(由此可见,新事物一定会战胜旧事物......)。韩国的反转剧最近似乎比较流行,称之为反转剧就在于其结果总是让人出乎意料,不合常理,其间又不乏各种搞怪搞笑的镜头,各种当红帅哥美女也一定让DDMM们爱不释手,20~30分钟一集的剧情一改韩剧拖沓的风貌,想看就看,容易切入。 反转剧,今天你看了吗?

如何突破自己的界限(ZZ)

大家都听说过温水煮青蛙的故事,也知道生于忧患死于安乐的道理,但是我们在生活中总会自然而然的根据自己的好恶养成一些习惯,在习惯的环境中,会感 觉很舒适,同时,这些习惯会开始渐渐在我们周围建起一座壁垒,哪怕这些习惯本身并没有什么错误,它们会慢慢局限我们的想法和决定,让我们失去很多应该获得 的机会,难以突破自己。 为什么我们常常会觉得工作和生活越来越沉闷,归根结底,是因为我们选择了这样的生活。 我们回避犯错误回避冒险。 不会犯错误的人永远不会创造出新的价值。 如果你想打破这种沉闷,让生活重新充满活力,下面有一些方法: 了解自己各种积习的真相。这些习惯往往曾经为你带来过成功,下一次你仍然会那么做。想要有所突破,必须放弃这些习惯,尝试新的思路模式和行动方法。除此之外别无他法,这些积习已经在阻碍你发现新鲜事物,让你停滞不前。 用不同的方法做事,看看效果。世界每一天都在发生变化,哪怕曾经让你无比成功的习惯,也不可能适应各种情况。 尝试用不同的方法做事,不要害怕失败,不要成为习惯的傀儡。 破除给自己强加的条条框框, 重新审视自己 ,给自己时间。积习难改,首先我们可能没有意识到这些习惯的存在,其次,在调整自我的过程中,这些习惯会不断的反扑,看看有多少人戒烟成功就知道了。 做你自己。很多时候我们不是在做自己,而是在做别人眼中的自己。大多数人都会有取悦别人的想法,希望达到别人的期望,哪怕是让自己变成自己都不愿 意成为的人。 你首先应该做好自己。 每个人都是不同的, 你应该把自己放在第一位,因为没有人会比你自己更在乎你。 把别人放在第二位是说给别人足够的尊重就可 以,不是让你完全忽略他们。 总是活在别人的阴影里是一种负担。 跳出这个圈子,给自己一个成为自己的机会。 放慢脚步,随遇而安。很多人都希望自己是一个充满智慧、优秀、受人爱戴的人。有时你的确是,有时却不一定。现实太复杂了,我们需要不断从别人那里 获取信息和支持来完成任何事情。我们所拥有的东西和知识都来自于别人。有时候,通过这些外界的帮助,我们可以做的更好。但有时却无法很好的利用。所以,要 了解自己是一个思想和感觉的复杂结合体,这些思想和感觉有时候很有用,有时候不。不需要给自己戴一个面具,也 不需要伪装自己什么都行,更没有必要因为发现自己的弱点而感到恐惧。 如果你能真诚的面对自己,会获得一种解脱。可能你不如自己想像得那么伟大,但也不

天将降大任于斯人也,必先折其体肤,洗其脑袋

元宵节就这么被一个半导体扼杀了。一趟大巴把我们拉到了汤山,我在那看到了keywords:温泉、洗浴、桑拿...可是没看到司机踩刹车... 当晚便开始训练,站在操场上,看着万家烟火,寒风凛冽,想着可怜的呱呱在家一个人吃汤圆,老泪纵横。Goodbye me lover, goodbye my friend. ——James Blunt语 当天正是降温的时候,第二天,天空居然飘起了小雪点,毛衣没带,冻得发抖。下午心动过速一小时,顶着,心里在想,如果倒下了,呱呱会怎样。接下来两天气温有些回升,训练也没有那么累了,Thank God。只是冬天的太阳狠,真狠,真是狠,真他妈狠,Yeah!脸皮痛,回到南京遂开始脱皮。一觉睡到大天亮,开始为期十二天的洗脑。生活颇为FB,行动却尤为不便,拜超级BT的领导所赐。好在呱呱也将有长达半月的培训,总算不会担心她会饿死,大饼的故事? 杀!!! ——顺带记念30年的第一次军训