Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19497
  • 博文数量: 33
  • 博客积分: 291
  • 博客等级: 准尉
  • 技术积分: 295
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-20 09:47
文章分类

全部博文(33)

文章存档

2011年(33)

我的朋友

分类: C/C++

2011-06-13 09:37:12

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

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

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

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

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

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

则修改程序为
#define foreach BOOST_FOREACH
#include
#include
using namespace std;
#include

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
        {
        typedef MyString::iterator type;
        };
    template<>
    struct range_const_iterator
        {
        typedef MyString::const_iterator type;
        };

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

    inline range_const_iterator::type boost_range_const_begin( const MyString& str)
        {
        return str.begin();
        }
    inline range_const_iterator::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<
        }
    return 0;
    }

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

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

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

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

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

五:相关链接

阅读(368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~