c++中foreach的一种实现方法

本文介绍了一种在C++中实现类型推演的方法,并基于此实现了一个通用的foreach宏,能够遍历多种容器类型,包括STL容器和数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标是如下

 

因为FOR_EACH(i, st)没有提供任何类型信息, 所以类型推演肯定是必须的

 

我后面会使用BOOST_TYPEOF

不过, 还是先提一下typeof原理吧

 

为了由运行时的表达式推演到静态的类型符号, 需要sizeof操作符,  比如sizeof(3 + 5), 其中的3 + 5永远不会被执行; 可见sizeof起到了表达式->常数的效果; 如果再完成常数->对应的类型的工作, 就实现了表达式->对应类型的转化

下面代码, 有注释; 需要一定的模板编程经验

 

 

 

 

而boost的typeof, 如果是高版本的vc的话, boost内部会利用__if_exists和__if_not_exists自动为各个类型分配合适的数字来绑定, 所以省略了注册类型的步骤(没有仔细研究过, 姑且这么想吧)

如果没有vc的扩展的话, boost也需要用BOOST_TYPEOF_REGISTER_TYPE来注册类型, 进而使用BOOST_TYPEOF

 

typeof也是当初我从网上他人的代码学到的, 所以有必要说明白; 不过那边没给注释, 我也没找到最初看到的地方了

总之, typeof我们有了(其实typeof比foreach更炫不是么)

 

 

foreach的实现, 注释得很详细了

需要上面的typeof和以前的容器无关迭代器

    

 

 

当然, 如果愿意手写变量类型(c#等的形式)

FOR_EACH(int, i, v)

也很容易实现, 毕竟困难的实现都在上面了

 

 

 

不过我还是说一句, 出于稳定性考虑, 使用boost最稳妥, 谁都不想被项目搞得头昏脑胀的时候这些小工具还给你蹦出些麻烦来吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值