使用 boost.foreach foreach
作者: 江淼Blog: http://blog.csdn.net/jiangfriend
时间: 2007-7-28 14:56
用过别的语言的朋友一定深受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.htmlboost官方站点 http://www.boost.org