C++ BOOST ForEach 与自定义宏

标签 c++ boost macros iterator boost-iterators

使用 BOOST 的 ForEach 和我自己的自定义 #define 宏来迭代容器有什么区别?

我的:

#define iterate(i,x)     for(typeof(x.begin()) i=x.begin();i!=x.end();++i)

boost:
#include <string>
#include <iostream>
#include <boost/foreach.hpp>

int main()
{
    std::string hello( "Hello, world!" );

    BOOST_FOREACH( char ch, hello )
    {
        std::cout << ch;
    }

    return 0;
}

请解释哪种方法更好以及为什么?

最佳答案

第一个大的区别是当您使用右值时,如下所示:

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())
{

}

这是因为 BOOST_FOREACH 检测它是否是右值并制作一个拷贝(可以被编译器删除)。

第二个区别是 BOOST_FOREACH 使用 Boost.Range检索迭代器。这使得它可以轻松扩展。因此它适用于数组和 std::pair。

第三个区别是您的 iterate 宏会自动推导出范围的类型,这对于支持 typeof 但不支持 auto 的旧编译器来说非常方便。不过,BOOST_FOREACH 适用于所有 C++03 编译器。

关于C++ BOOST ForEach 与自定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179636/

相关文章:

c++ - 使用系统调用打开 Outlook 2010 以发送预格式化的电子邮件

c++ - 如何将卡方分布与 C++ Boost 库一起使用?

python - 使用嵌入式 Python 调用对象实例的函数

macros - 如何在 haxe 中获取宏模式下的导入列表?

haskell - (模拟)Haskell 中的宏?

c++ - cpp字节文件读取

C++ 11 正则表达式堆栈溢出/VS2012

c++ - 通过使用带有私有(private)数据成员的类重载 + 运算符来添加分数

c++ - Boost::Regex 段错误(我认为)

c - 宏中 '_'的用途是什么