模板与宏本质上有什么区别??? 我怎么觉得模板就是增强形的宏!模板也是在相应的地方把代码展开,然后再进行编译链接。
如果模板与宏本质上没有区别,那么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




