CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

模板与宏本质上有什么区别??? 我怎么觉得模板就是增强形的宏!模板也是在相应的地方把代码展开,然后再进行编译链接。

楼主zwjchina(蒲石)2006-08-01 22:23:16 在 VC/MFC / 基础类 提问

如果模板与宏本质上没有区别,那么C++提倡少用宏,为何要鼓励使用模板呢? 问题点数:50、回复次数:9Top

1 楼CW_Wei(朗 月)回复于 2006-08-01 23:55:32 得分 0

关注Top

2 楼SoLike(思危)回复于 2006-08-02 00:07:57 得分 10

用   Bjarne   Stroustrup的话说模板语言内置,是类型安全的。  
  而宏是一个文字魔术,他是属于编译器的。  
   
  不过宏是在太强大了,生命力如此远远超出了人们的想像,C++   设计了模板,设计了常量,设计了内联函数,居然还没有把宏给枪毙掉,真是个笑话。Top

3 楼pomelowu(羽战士)回复于 2006-08-02 00:17:19 得分 5

嗯。上个礼拜面试的时候遇到这个问题了。Top

4 楼hdqqq(小西瓜)回复于 2006-08-02 00:56:51 得分 10

模板是类型安全的,   范型编程是对模板的功能很好的表现,   不过   宏生成代码的能力也是很强的,   boost   中的   pre   processor   把宏用的也很精彩.Top

5 楼SoLike(思危)回复于 2006-08-02 01:10:01 得分 5

宏用好了,效果真的很可怕,简直无所不能了。Top

6 楼BLsoft(網龍ζ龍活)(Cyber-Security of [MVP])回复于 2006-08-02 09:01:29 得分 10

宏用太多不好。   除非你的代码已经不打算在怎么大改了。Top

7 楼hailongxl(吹雪)回复于 2006-08-02 09:19:55 得分 0

高手高手高高手,一大堆.Top

8 楼zwjchina(蒲石)回复于 2006-08-02 09:59:31 得分 0

继续弱弱的问一下。  
  如果模板只不过是在相应的地方把代码展开成针对具体类型的1个类,1个过程  
   
  那么可以使用外部工具直接在该处生成代码,有什么必要把它作为语言特征???  
   
  不知道我说的大家明不明白!高手继续发表意见啊。  
  我一直没想明白,总觉得模板不该是必须的东西,也就是说模板只是帮我们简化了代码的  
  书写,并不是增加了什么功能。仅此而已。Top

9 楼hdqqq(小西瓜)回复于 2006-08-08 07:56:11 得分 10

模板关键还是在于编译器在进行编译的时候的模板演绎能力,同时   象   特化,偏特化,编译器的递归演绎等功能,使得模板和宏相比有了很大的功能提升,引入范型编程概念后产生的stl库是一个很好的模板运用的例子,提供了一些常用的数据结构和算法,提高了代码的重用性,现在使用编译器的递归演绎能力产生的模板元编程和将   设计模式和模板结合使用的一些方法为模板提供了一种新的应用方式.如下面的代码就可以计算   1   至   100   的和  
   
  template   <int   i>  
  struct   calc_sum  
  {  
          enum   {  
                  value   =   calc_sum<i   -   1>::value   +   i,  
          };  
  };          
   
  template   <>  
  struct   calc_sum<1>  
  {  
          enum   {  
                  value   =   1,  
          };  
  };      
   
  void   test()  
  {  
          cout   <<   calc_sum<100>::value   <<   endl;  
  }  
   
  当然,boost库中也可以通过宏实现累加得到相同的结果  
   
  #include   <boost/preprocessor/inc.hpp>  
  #include   <boost/preprocessor/repeat_from_to.hpp>  
  #include   <boost/preprocessor/comparison.hpp>  
  #include   <boost/preprocessor/empty.hpp>  
  #include   <boost/preprocessor/enum_params.hpp>  
   
  #define   JIA_HAO()   +  
   
  #define   M_CALC(a,b,c)   \  
  BOOST_PP_IF(BOOST_PP_GREATER(b,1),   JIA_HAO     ,BOOST_PP_EMPTY     )   ()   \  
  b \  
   
  #define   MACRO_CALC_SUM(n)     BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_INC(n),M_CALC,   _   )  
   
  void   tt_test()  
  {  
  int   i;  
  i   =   MACRO_CALC_SUM(100);  
  cout   <<   i   <<   endl;  
   
  }  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:zwjchina
  • SoLike
  • pomelowu
  • hdqqq
  • SoLike
  • BLsoft
  • hdqqq

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo