欢迎来到天天文库
浏览记录
ID:34654767
大小:183.28 KB
页数:6页
时间:2019-03-08
《有限元方法编程c++模板元编程new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、有限元方法编程:C++模板元编程疯狂代码http://CrazyCoder.cn/ĵ:http:/CrazyCoder.cn/VC/Article12962.html 如果你仅把它看作古怪特性而没有打动你那你就不会对它有足够深入研究 C并不是为templatemetaprogramming(模板元编程)设计但是自从TMP在1990年代早期被发现以来它已被证明非常有用使TMP变容易扩展很可能会被加入到语言和它标准库的中是TMP是被发现而不是被发明TMP所基于特性在templates(模板)被加入C时候就已经被引进了所需要全
2、部就是有人注意到它们能够以种精巧而且意想不到方式被使用 TMP有两个强大力量首先它使得用其它思路方法很难或不可能些事情变得容易第2templatemetaprograms(模板元)在C编译期间执行它们能将工作从运行时转移到编译时个结果就是通常在运行时才能被察觉能够在编译期间被发现另个结果是C使得TMP使用在以下每个方面都能更有效率:更小可执行代码更短运行时间更少内存需求(然而将工作从运行时转移到编译时个结果就是编译过程变得更长使用TMP可能比它们non-TMP对等物占用长得多编译时间) 考虑STLadvance伪代码(在
3、C箴言:为类型信息使用特征类中你现在可能需要读该文在本文中我假设你已经熟悉了该文内容)我突出表示代码中伪代码部分:templatevoidadvance(IterT&iter,DistTd){(iterisarandomaccessiterator){iterd;//useiteratorarithmetic}//forrandomaccessiters{(d>=0){while(d--)iter;}//useiterativecallsto{while(d)--it
4、er;}//or--forother}//iteratorcategories} 我们可以用typeid把伪代码变成真正代码这就产生了个解决此问题“常规”C思路方法——它全部工作都在运行时做:templatevoidadvance(IterT&iter,DistTd){(typeid(typenamestd::iterator_traits::iterator_category)typeid(std::random_access_iterator_ta
5、g)){iterd;//useiteratorarithmetic}//forrandomaccessiters{(d>=0){while(d--)iter;}//useiterativecallsto{while(d)--iter;}//or--forother}//iteratorcategories} C箴言:为类型信息使用特征类中指出这个typeid-based(基于typeid)思路方法比使用traits思路方法效率低这个思路方法(1)类型检测发生在运行时而不是编译期(2)用来做运行时类型检测代码必须出现在可执行
6、代码中实际上这个例子展示了TMP如何能比个“常规”C更高效traits思路方法是TMP记住traits允许编译时在类型上...计算 我先前谈及些事情在TMP中比在“常规”C中更简单而advance提供了这方面个例子Item47提到advancetypeid-based(基于typeid)实现可能会导致编译问题而这就是个产生问题例子:std::list<>::iteratoriter;...advance(iter,10);//moveiter10elementsforward;//won'tcompilewithabov
7、eimpl. 考虑advance为上面这个生成版本用iter和10类型取代templateparameters(模板参数)IterT和DistT的后我们得到这个:voidadvance(std::list<>::iterator&iter,d){(typeid(std::iterator_traits::iterator>::iterator_category)typeid(std::random_access_iterator_tag)){iterd;//error!}{(d>=0){while(
8、d--)iter;}{while(d)--iter;}}} 问题在突出显示行使用了那行在当前情况下我们试图在个list<>::iterator上使用但是list<>::iterator是个bidirectionaliterator(双向迭代器)(参见C箴言:为类型信息使用特征类)所以它不
此文档下载收益归作者所有