我正在测试从binsearch.hpp进行二进制搜索的实现:

template<typename Iterator, typename T>
Iterator binsearch(Iterator begin, Iterator end, const T &v) {
    if (std::distance(begin, end) == 0) {return end;}

    Iterator save = end;

    while (std::distance(begin, end) > 0) {
        Iterator mid = begin + std::distance(begin, end) / 2;

        if (*mid == v) {
            return mid;
        }

        if (v < *mid) {
            end = mid;
        } else {
            begin = mid + 1;
        }
    }

    return save;
}

使用以下Boost驱动的单元测试test_binsearch.cpp:
#define BOOST_TEST_MODULE test_binsearch
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

#include "binsearch.hpp"

BOOST_AUTO_TEST_CASE(empty_0) {
    std::vector<int> xs = {};

    const auto result = binsearch(xs.begin(), xs.end(), 42);

    BOOST_TEST((result == xs.end()));
}

除非我将BOOST_TEST中的比较用一对多余的括号括起来,否则我会得到一个非常神秘且冗长的编译错误,该错误反复尝试将迭代器转换为char,错误代码和其他几种类型:



我得到了用多余的括号from here包围我的比较的线索。没有它们,为什么无法编译?

最佳答案

从BOOST_TEST的documentation中:



输出



注意测试失败报告中强调的部分。对于那些中等程度地使用C++的人来说,这似乎是魔术(新手不会感到惊讶,因为他们不了解该语言的局限性;专家们知道这个 secret 或很容易就可以弄清楚它)。

该文档从表面上解释了“魔术”,如下所示:



但是,“魔术”不适用于无法“打印到std::ostream”的类型。因此,您的编译错误。幸运的是,“魔术”(基于运算符重载)不能覆盖运算符优先级的C++规则。通过添加额外的一对括号,您可以定义“魔术”无法到达的区域。

关于c++ - 为什么BOOST_TEST(((Iterator == Iterator))需要额外的括号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37896432/

10-17 01:41