目标是如下
因为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最稳妥, 谁都不想被项目搞得头昏脑胀的时候这些小工具还给你蹦出些麻烦来吧