使用 boost.foreach foreach

用过别的语言的朋友一定深受foreach这个命令所带来方便,可惜C++并没提供,随着1.34.0 boost.foreach正式成为boost的一部分,而且boost.foreach相当的简单易用。从此c++也有了foreach。

一、使用方法

语法:
BOOST_FOREACH( VAR, COL )
{
    // To do
}
非常简单明了

例:
#include <string>
#include <iostream>
using namespace std;
#include <boost/foreach.hpp>
int main(int argc, char* argv[])
    {
    string str("The quick brown fox jumps over the lazy dog.");
    BOOST_FOREACH(char c,str)
        {
        cout<<c<<endl;
        }
    return 0;
    }

若#define foreach BOOST_FOREACH,几乎可以把foreach当成是内部保留关键字。

二、扩展foreach

并不是所有的对象都能支持foreach
如:
struct MyString
    {
    string str;
    };
那么我们需要自已手动扩展foreach。

相应的,需要重写以下几个相关函数与结构
range_iterator<Link>;
boost_range_begin( Link& );
boost_range_end(Link& );
range_const_iterator<Link>; //常数
boost_range_begin(const Link&);
boost_range_end(const Link& );

则修改程序为
#define foreach BOOST_FOREACH
#include <string>
#include <iostream>
using namespace std;
#include <boost/foreach.hpp>

struct MyString
    {
    string str;
    typedef string::iterator iterator;
    typedef string::const_iterator const_iterator;
    MyString(const string& str):str(str)
        {
        }
    inline iterator begin(void)
        {
        return str.begin();
        }
    inline iterator end(void)
        {
        return str.end();
        }
    inline const_iterator begin(void) const
        {
        return str.begin();
        }
    inline const_iterator end(void) const
        {
        return str.end();
        }
    };

/**
 * 以下为主要重写代码
 */
namespace boost
    {
    template<>
    struct range_iterator<MyString>
        {
        typedef MyString::iterator type;
        };
    template<>
    struct range_const_iterator<MyString>
        {
        typedef MyString::const_iterator type;
        };

    inline range_iterator<MyString>::type boost_range_begin( MyString& str)
        {
        return str.begin();
        }
    inline range_iterator<MyString>::type boost_range_end( MyString& str)
        {
        return str.end();
        }

    inline range_const_iterator<MyString>::type boost_range_const_begin( const MyString& str)
        {
        return str.begin();
        }
    inline range_const_iterator<MyString>::type boost_range_const_end( const MyString& str)
        {
        return str.end();
        }
    }
int main(int argc, char* argv[])
    {
    MyString str("The quick brown fox jumps over the lazy dog.");
    foreach(char c,str)
        {
        cout<<c<<endl;
        }
    return 0;
    }

虽然有点烦,但还是相当简单的。

三、注意事项

因语言限制BOOST_FOREACH(std::pair<int,int>& p,m)是不被支持的
因为int与int之间存在逗号,而BOOST_FOREACH是宏,BOOST_FOREACH理解为(std:pair<int,    int>&p,m)

int main(int argc, char* argv[])
    {
    map<int,int> m;
    m[1]=1;
    foreach(const map<int,int>::value_type& p,m) //错误
        {
        cout<<p.first<<endl;
        }
    return 0;
    }

需改写成
int main(int argc, char* argv[])
    {
    typedef map<int,int> map_int;
    map_int m;
    m[1]=1;
    foreach(const map_int::value_type& p,m)
        {
        cout<<p.first<<endl;
        }
    return 0;
    }

四:篇后语

foreach简化了编程过程实在可喜可贺,但boost普及率不高,也只能内部用用,比较可惜的。
另外,boost.foreach对于non-copyable与lightweight也有特别的处理方式,具体情况可以参照官方文档。

五:相关链接

foreach官方文档 http://www.boost.org/doc/html/foreach.html
boost官方站点 http://www.boost.org
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值