免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3557 | 回复: 12
打印 上一主题 下一主题

C++的template有点“神奇” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-25 01:32 |只看该作者 |倒序浏览
最近开始接触了点C++,看到template这章,觉得C++的template有点神奇呦。
就拿下面的小程序作例子:
template<class Type, int size> 中size作为一个非类型参数,这样就可以直接知道传入的数组了?

而在C中,数组作为参数如果不传入一个长度,是无法知道数组大小的,所以觉得有点“神奇”

#include <iostream>

using std::cout;
using std::endl;

template <class Type, int size>
Type min( const Type (&array)[size] )
{
&nbsp;&nbsp;&nbsp;&nbsp;Type min_val = array[ 0 ];
&nbsp;&nbsp;&nbsp;&nbsp;for ( int i = 1; i < size; i++ )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( min_val > array[i] )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min_val = array[i];
&nbsp;&nbsp;&nbsp;&nbsp;return min_val;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;const int array[] = { 3, 5, 2, 9, 7, 1, 6 };
&nbsp;&nbsp;&nbsp;&nbsp;int min_val;

&nbsp;&nbsp;&nbsp;&nbsp;min_val = min( array );
&nbsp;&nbsp;&nbsp;&nbsp;cout << "The min value is " << min_val <<endl;

&nbsp;&nbsp;&nbsp;&nbsp;return 0;

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
2 [报告]
发表于 2008-10-25 01:39 |只看该作者
模板和泛型编程的确是C++神奇的地方

论坛徽章:
0
3 [报告]
发表于 2008-10-25 09:30 |只看该作者
这跟模板没关系,是因为你用的数组引用

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2008-10-25 10:03 |只看该作者
这当然跟模板有关系,只不过编译器会为不同的传入参数生成不同的函数,然后再为你去调用它。
比如int a[10]和int b[20]作参数,所调用的是不同的函数,而模板函数里面里面的size则会被编译为一个“立即数”。
如果这样的模板函数被调用多次,并且每次调用的参数数组的大小都不同,会导致代码体积剧增,还不如用C方式附加传一个数组大小作参数。

论坛徽章:
0
5 [报告]
发表于 2008-10-25 10:44 |只看该作者
原帖由 tyc611 于 2008-10-25 09:30 发表
这跟模板没关系,是因为你用的数组引用


貌似不对,如果不用模板,单单用引用如何直接就得出数组的长度?

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
6 [报告]
发表于 2008-10-25 13:06 |只看该作者
原帖由 LinuxKen 于 2008-10-25 01:32 发表
最近开始接触了点C++,看到template这章,觉得C++的template有点神奇呦。
就拿下面的小程序作例子:
template 中size作为一个非类型参数,这样就可以直接知道传入的数组了?

而在C中,数组作为参数如果不传 ...


如果是指针就不行了,建议以后的 C++ 加上RTTI 功能。

论坛徽章:
0
7 [报告]
发表于 2008-10-25 17:36 |只看该作者
确实“神奇”

等着看正解

论坛徽章:
0
8 [报告]
发表于 2008-10-25 18:14 |只看该作者
我建议你看看汇编 ,就一点不神奇了

论坛徽章:
0
9 [报告]
发表于 2008-10-25 21:39 |只看该作者
原帖由 LinuxKen 于 2008-10-25 10:44 发表


貌似不对,如果不用模板,单单用引用如何直接就得出数组的长度?

模板只是方便针对不同大小的数组的代码复用而已,这里的本质是数组引用,比如

  1. #include <iostream>
  2. #include <iterator>
  3. using namespace std;

  4. void Init(int (&a)[10])
  5. {
  6.     const int NUM = sizeof(a) / sizeof(a[0]);
  7.     for (int i = 0; i < NUM; ++i)
  8.         a[i] = i + 1;
  9. }

  10. int main()
  11. {
  12.     int a[10];
  13.     Init(a);
  14.     copy(a, a + 10, ostream_iterator<int>(cout, " "));
  15.     cout << endl;
  16.    
  17.     return 0;
  18. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2008-10-25 21:41 |只看该作者
原帖由 zhujiang73 于 2008-10-25 13:06 发表


如果是指针就不行了,建议以后的 C++ 加上RTTI 功能。

数组要与C兼容,不会改变的
你需要用的是vector
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP