C++ C++;boostforeach与自定义宏
使用BOOST的ForEach和我自己的自定义#define宏迭代容器有什么区别 地雷:C++ C++;boostforeach与自定义宏,c++,boost,macros,iterator,boost-iterators,C++,Boost,Macros,Iterator,Boost Iterators,使用BOOST的ForEach和我自己的自定义#define宏迭代容器有什么区别 地雷: #为(typeof(x.begin())i=x.begin();i!=x.end();++i)定义迭代(i,x) 促进: #包括 #包括 #包括 int main() { string hello(“你好,世界!”); BOOST_FOREACH(char ch,你好) { std::cout第一个大区别是,当您使用右值时,如下所示: vector<int> foo(); // foo() i
#为(typeof(x.begin())i=x.begin();i!=x.end();++i)定义迭代(i,x)
促进:
#包括
#包括
#包括
int main()
{
string hello(“你好,世界!”);
BOOST_FOREACH(char ch,你好)
{
std::cout第一个大区别是,当您使用右值时,如下所示:
vector<int> foo();
// foo() is evaluated once
BOOST_FOREACH(int i, foo())
{
}
// this is evaluated twice(once for foo().begin() and another foo().end())
iterate(i, foo())
{
}
vector foo();
//foo()只计算一次
BOOST_FOREACH(inti,foo())
{
}
//这将计算两次(一次用于foo().begin(),另一次用于foo().end())
迭代(i,foo())
{
}
这是因为BOOST\u FOREACH
检测它是否为右值并生成一个副本(编译器可以省略)
第二个区别是BOOST\u FOREACH
用于检索迭代器。这使得它可以轻松扩展。因此它可以在数组和std::pair
上工作
第三个区别是,iterate
宏自动推断范围的类型,这在支持typeof
但不支持auto
的较旧编译器上非常方便。但是,BOOST\u FOREACH
将在所有C++03编译器上运行。BOOST可能已将其代码配置为在没有非标准的typeof
扩展。一个区别是BOOST\u FOREACH
使用普通数组,即chara[]={“你好,世界!”}你不应该依赖于<代码> Type of < /C> >,这不是标准C++。你应该使用<代码> DeCype < /Cord> @ MariusBancila,如果你有一个支持<代码> DECKECTON/CODE >的编译器,那么它也很可能支持循环的<>代码>,在这种情况下,宏都是多余的。VS2010支持前者,但不支持后者:-S@Praetorian,完全同意。你似乎在暗示BOOST\u-FOREACH
只在支持auto
的编译器上工作。那不是真的。BOOST\u-FOREACH
不使用任何C++11功能,事实上在非常古老的编译器上工作。BOOST\u-FOREACH
是100%符合C++03,这是它与OP的迭代
宏之间的另一个区别。@EricNiebler抱歉,我不是有意暗示它需要自动
,我更正了它以使它更清晰。
vector<int> foo();
// foo() is evaluated once
BOOST_FOREACH(int i, foo())
{
}
// this is evaluated twice(once for foo().begin() and another foo().end())
iterate(i, foo())
{
}