答案如下,其它的操作本质上差不多,有兴趣的读者可自行挑战一下,就不在这里啰嗦:
template<class TL, class T> struct IndexOf; // 当搜索空的 typelist 时,结果为 -1. template<> struct IndexOf<NullType, T> { enum { value = -1 }; }; // 当前节点的类型为所想要搜索的类型时 template<class T, class Tail> struct IndexOf<Typelist<T, Tail>, T> { enum { value = 0 }; }; // 当前节点不是所查找的类型时,递归地在 Tail 中进行查找。 template<class Head, class Tail, class T> struct IndexOf<Typelist<Head, Tail>, T> { enum { in_tail = IndexOf<Tail, T>::value }; // 使用三元操作符进行判断,T 是否在 Tail 中存在。 enum { value = (in_tail >= 0)? 1 + in_tail: -1 }; }; |
从上面的例子我们可以看到,因为 c++ 支持对模板递归式的解析(也就是一个模板依赖于另一个模板时,先解释被依赖的模板),使得模板事实上有了很强的编译时运行的能力,这种能力表面上看起来可能不容易操控,但却显然是潜力无限的,不过它的缺点也比较明显:
编译时代码与运行时代码搅在一起,在处理复杂问题时,程序的逻辑可能不容易读懂。
编译时调试现阶段的支持还不够好。
网络上关于 c++ 模板元编程的讨论有很多,模板的各种能力技巧也渐渐被越来越多的人所发现所挖掘,但是在实际的工作中,对很多人来说模板元编程却仍一直处于比较保守的状态,到底过分依赖模板元编程缺点还是太明显,就我的见闻来说,完全基于模板元编程做出来的比较出名的工具型的东西,主要有两个:boost spirit 与 boost proto. 它们的使用体验,老实说都不是很好。。。特别是 spirit。而至于它们的实现,对有兴趣练习深入这方面技能的程序猿来说,这两者倒确实是不可多得好素材,尤其是 proto, 代表了一个高峰。
好消息是,伴随着 c++11 的到来,好些众人期盼以久的新特性终于从理想照进现实,尤其是 variadic parameter 的加入,可以预见将再度大大提升模板的能力,c++ 标准沉寂近10年后迎来了一个新时期,甚至还有人曾经提议要加入 static_if,concept 等概念也在酝酿中了,变化是唯一永恒不变的东西,你,作好准备了吗?