免费注册 查看新帖 |

Chinaunix

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

[C++] 自己写的一个foreach,欢迎拍砖 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-01 20:41 |只看该作者 |倒序浏览
___________foreach.h_______________
#ifndef traxex_foreach
#define traxex_foreach
#define _traxex_element_size( _foreach_array)            \
    ( (char*)( _foreach_array+1)-(char*)(_foreach_array))

#define _traxex_array_length( _foreach_array)                \
    ( sizeof( _foreach_array)/_traxex_element_size(_foreach_array))

#define _traxex_foreach( _foreach_element,_foreach_array)        \
    if( unsigned int _foreach_index=0){}else                \
    if( unsigned int _foreach_size=_traxex_array_length( _foreach_array)) \
&nbsp;&nbsp;&nbsp;&nbsp;for(_foreach_index=0; _foreach_index<_foreach_size; _foreach_index++)\
&nbsp;&nbsp;&nbsp;&nbsp;if( bool _foreach_continue=true)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\
&nbsp;&nbsp;&nbsp;&nbsp;for( _foreach_element=_foreach_array[_foreach_index];_foreach_continue;_foreach_continue=false)

#define foreach _traxex_foreach
#endif




_____________测试用代码______________
#include<iostream>
#include"foreach.h"

using namespace std;


int main( int argc,char* argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;int array[]={2,3,5,7,9,8,};

&nbsp;&nbsp;&nbsp;&nbsp;foreach( int& x,array)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x*=2;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;cout<<"array={";
&nbsp;&nbsp;&nbsp;&nbsp;foreach( int x,array)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<<x<<",";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;cout<<"\b}\n";
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}



________________运行输出___________
traxex # g++ -Wall -o array array.cc
traxex # ./array
array={4,6,10,14,18,16}
traxex #

[ 本帖最后由 gtkmm 于 2008-9-1 20:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-01 20:47 |只看该作者

using namespace std;


int main( int argc,char* argv[])
{
&nbsp;int array[]={2,3,5,7,9,8,};

//字太多,放不下,所以我只贴了一部分。这个文件如果用boost的foreach,宏展开后的文件是:24723行。
//对C++有些觉得可怕了。。。

&nbsp;cout<<"array={";
&nbsp;if (boost::foreach_detail_::auto_any_t _foreach_col = boost::foreach_detail_::contain( (array) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(array)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(array) : (array)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (boost::foreach_detail_::auto_any_t _foreach_cur = boost::foreach_detail_::begin( _foreach_col , (true ? 0 : boost::foreach_detail_::encode_type(array, boost::foreach_detail_::is_const_(array))) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(array)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(array) : (array)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (boost::foreach_detail_::auto_any_t _foreach_end = boost::foreach_detail_::end( _foreach_col , (true ? 0 : boost::foreach_detail_::encode_type(array, boost::foreach_detail_::is_const_(array))) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(array)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(array) : (array)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(array) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else for (bool _foreach_continue = true; _foreach_continue && !boost::foreach_detail_::done( _foreach_cur , _foreach_end , (true ? 0 : boost::foreach_detail_::encode_type(array, boost::foreach_detail_::is_const_(array)))); _foreach_continue ? boost::foreach_detail_::next( _foreach_cur , (true ? 0 : boost::foreach_detail_::encode_type(array, boost::foreach_detail_::is_const_(array)))) : (void)0) if (boost::foreach_detail_::set_false(_foreach_continue)) {} else for (int& x = boost::foreach_detail_::deref( _foreach_cur , (true ? 0 : boost::foreach_detail_::encode_type(array, boost::foreach_detail_::is_const_(array)))); !_foreach_continue; _foreach_continue = true)
&nbsp;{
&nbsp;&nbsp;cout<<x<<",";
&nbsp;}
&nbsp;cout<<"\b}\n";
&nbsp;return 0;
}


[ 本帖最后由 gtkmm 于 2008-9-1 20:49 编辑 ]

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
3 [报告]
发表于 2008-09-01 20:54 |只看该作者
挺好,赞一个!
#define中
if( unsigned int _foreach_index=0){}else                \
为啥这么写呢,直接写成:
unsigned int _foreach_index=0;    \
不就可以了吗?

后面的if( bool _foreach_continue=true)也是类似的,直接
bool _foreach_continue=true;
就行了。

论坛徽章:
0
4 [报告]
发表于 2008-09-01 20:59 |只看该作者
原帖由 happy_fish100 于 2008-9-1 20:54 发表
挺好,赞一个!
#define中
if( unsigned int _foreach_index=0){}else                \
为啥这么写呢,直接写成:
unsigned int _foreach_index=0;    \
不就可以了吗?

后面的if( bool _foreach_cont ...

你试一试,宏不是那么简单的。
你这样写,就变成语句了,会出错的。
我开始也没有仔细想过,以为轻松实现呢。
碰了很多钉子后,仔细读boost的实现,才得出这样的一个结果,己经是相当的简化了。。
这么点事,boost这么牛X的库,都用了2万多行,说明不是简单的。。
再少一些东西,至少我是办不到了。。

[ 本帖最后由 gtkmm 于 2008-9-1 21:01 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-09-01 21:22 |只看该作者
很好,看不懂。呵呵。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2008-09-01 22:18 |只看该作者
原帖由 gtkmm 于 2008-9-1 20:59 发表

你试一试,宏不是那么简单的。
你这样写,就变成语句了,会出错的。
我开始也没有仔细想过,以为轻松实现呢。
碰了很多钉子后,仔细读boost的实现,才得出这样的一个结果,己经是相当的简化了。。
这么点 ...


变成语句也是可以的啊。我定义过象这样包含多个语句的宏。

论坛徽章:
0
7 [报告]
发表于 2008-09-01 22:53 |只看该作者
1, 厉害,没看懂。 感觉变量的作用域都不对啊,怎么还能工作,呵呵。

2,能举例说明一下它在实际应用中的价值么?
直接
    for(int* elem = array;
        elem < array + sizeof(array)/sizeof(int);
        ++elem)
    {
        *elem = 1;
    }

不是也挺简单的么?

3, 相比用stl的算法、iterator和container有什么优点?


  1. $ cat test.cc
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <ext/numeric>

  5. int main( int argc,char* argv[]) {
  6.     int array[]={2,3,5,7,9,8,};
  7.     int* end = array + sizeof(array)/sizeof(int);
  8.     __gnu_cxx::iota (array, end, 100);
  9.     std::copy(array, end, std::ostream_iterator<int>(std::cout, ","));
  10.     return 0;
  11. }

  12. lgfang@arc-s3408cn ~/tmp
  13. $ g++ test.cc; ./a.exe
  14. 100,101,102,103,104,105,
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-09-01 23:54 |只看该作者

回复 #7 lgfang 的帖子

不错不错,就是有点复杂
多点注释好些

container:就是容纳各种数据类型的一个容器,可以认为它是一个盒子或箱子 将数据封装
  
  iterator:就是指向容器容纳的数据的一个泛型指针,通过它来遍历容器,访问容器里的元素

会更方便

[ 本帖最后由 qliu00 于 2008-9-4 23:22 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-09-02 14:10 |只看该作者
首先谢谢楼主的分享。看得出楼主为了避免复合语句采用了不少特殊方法,废了翻脑筋。不过不得不说的是,这样子降低了效率。

6楼的牛说宏定义能包含多个语句,我很菜,没见过,呵呵。那位高手能给我讲一下怎么写吗,最好给个小例子,嘿嘿。

论坛徽章:
0
10 [报告]
发表于 2008-09-02 19:34 |只看该作者
原帖由 happy_fish100 于 2008-9-1 22:18 发表


变成语句也是可以的啊。我定义过象这样包含多个语句的宏。

你弄一个来,我膜拜一下来。。。。
这个宏很特殊,不是很容易办到的。
因为这个宏不能有语句

哪位有兴趣分析一下,我在二楼帖的那个boost的foreach实现代码。。
比我的复杂得多,

[ 本帖最后由 gtkmm 于 2008-9-2 19:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP