【问题标题】:C++ Boost: Any gotchas with BOOST_FOREACH?C++ Boost:BOOST_FOREACH 有什么问题吗?
【发布时间】:2009-04-04 10:30:25
【问题描述】:

这是为 Boost 专家准备的。程序员在进入并将所有旧的 C/C++ 样式循环替换为看起来简洁的 BOOST_FOREACH 之前,是否有任何陷阱或细节需要注意?

(本题部分来源于here。)

【问题讨论】:

    标签: c++ boost loops


    【解决方案1】:

    看看:

    【讨论】:

    • 第 1 点是 BOOST_FOREACH 的问题吗?据我了解 BOOST_FOREACH,对每个参数进行一次且仅一次评估。不? “它只对它的论点进行一次评估,不会导致令人讨厌的意外”--docs
    【解决方案2】:

    BOOST_FOREACH - 宏,我不喜欢宏,更喜欢使用 STL 算法 + lambda + 绑定。

    C++0x 也将在 BOOST_FOREACH 上包含 for-loop 类似:

    int my_array[5] = {1, 2, 3, 4, 5};
    for(int &x : my_array)
    {
      x *= 2;
    }
    

    这是不使用部分失效的 BOOST_FOREACH 的另一个原因。

    【讨论】:

    • 其实这就是我开始使用BOOST_FOREACH的原因。语法非常相似,因此一旦 C++0x 构造可用,您就可以使用简单的正则表达式搜索和替换操作来更新您的代码。
    • 我很怀疑,非常怀疑。 tr1 仍然不是到处可用,那是很久以前的事了。如果 C++ 不会因臃肿而死,C++09 将以这个速度在 2020 年之前完全可用。
    • 是的,有些人暂时不使用/不喜欢 STL,也不会使用新的 C++0x 特性到 2020 年。但事实接下来说:VC 和 GCC 编译器已经支持一些 C++ 0x 功能。
    • 这就是问题,它只是“一些”,而一些是低悬的果实:/
    【解决方案3】:

    因为它只是一个宏,所以你不能在类型名中使用逗号,所以
    BOOST_FOREACH(pair<int,int> A, mapB){}
    不会工作。
    对于其他缺点,我会咨询BOOST_FOREACH() documentation

    【讨论】:

    • 我相信 BOOST_FOREACH( (pair A), mapB) 应该可以工作。虽然没有检查。
    • 行不通,我花了半天时间试图弄清楚它是我们的,直到它突然严格我这是一个宏。宏不理解模板,他们认为逗号只是替换的另一个参数
    • auto 是你的朋友! BOOST_FOREACH(auto a, mapB) {...}
    • 简单的解决方案是使用typedef,例如typedef pair<int,int> MyIntPair; BOOST_FOREACH(MyIntPair A, mapB)
    • 最简单的解决方法是打领带,这里解释:stackoverflow.com/a/8859736/375343
    【解决方案4】:

    我分析了 BOOST_FOREACH 与手动编码循环。 BOOST_FOREACH 在一个增加大小为 100,000 的向量的元素的简单循环中慢了大约 30%。 所以,如果你正在编写一个小循环,它不会那么快。一旦你的循环进行了主要处理,阿姆达尔定律就会生效,BOOST_FOREACH 造成的损失可以忽略不计。

    【讨论】:

      【解决方案5】:

      看看 BOOST_FOREACH 宏的源代码(在 foreach.hpp 中)——这不是我所说的“精益求精”:-)

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多