跳至主要内容

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分钟一集的剧情一改韩剧拖沓的风貌,想看就看,容易切入。 反转剧,今天你看了吗?

from cpp to java

when i start to study java with a cpp background, i find it is very difficult to convert my mind. i always think how some features in cpp was implemented in java, this give me a little reject to java language. though java is born from c, i think they still have different applicable domains, so try to study both is good for me, and java is a pure OO language, i believe it will give me a better understanding on OOD.

biblioscape, endnote, no, none of them

endnote在与word2003搭配时经常占据严重的CPU,非常不好用。今天听说biblioscape好,下之,唉,高兴的日子总是那么短暂,BUG一堆。它只支持rtf格式的转换,在word里format时,还要转为rtf格式后再转回来。甚至在重复转换过程中也产生了不一致,可能它在RTF和DOC之间的转换没有那么精确吧。好想用latex排,不过时间紧迫,现在懒得去学了。 都不用了,还是手工输入参考文献罢了。也许,open office?下一个先。