C++模板元编程的一点体会

发表于:2014-10-08 10:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:tarbitrary    来源:51Testing软件测试网采编

  答案如下,其它的操作本质上差不多,有兴趣的读者可自行挑战一下,就不在这里啰嗦:
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 等概念也在酝酿中了,变化是唯一永恒不变的东西,你,作好准备了吗?
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号