c++ - 使我的结构或类与 std::round 兼容

标签 c++ math rounding

鉴于以下情况,我如何使我的类或结构与 std::round 兼容? (而且我假设同样的事情也会使它与 std::floorstd::ceil 一起使用)。我可以这样做吗?

C++ Shell version

#include <cmath>

struct Rectangle
{
    Rectangle(double _x1, double _x2, double _y1, double _y2) : 

        x1(_x1), y1(_y1), x2(_x2), y2(_y2) 

    {

    }

    double x1, y1, x2, y2;
};

int main(void )
{
    auto r = Rectangle(10.3, 10.4, 10.5, 10.6);

    r = std::round(r);

    std::cout << r.x1 << "," << r.y1 << "," << r.x2 << "," << r.y2 << std::endl;
}

最佳答案

你不能制作std::round这样做:它已经被定义了,你不能在命名空间 std 中添加新的重载。

可以做的是编写一个新函数并使用它(一个简单的函数或一个方法,如 Tartan Llama 所示,但我更喜欢这里的自由函数)

Rectangle round(Rectangle const &original) {
    return { std::round(original.x1), std::round(original.y1),
             std::round(original.x2), std::round(original.y2) };
}

同样,将其添加到 namespace std 是非法的。只需确保它与 Rectangle 本身位于同一命名空间中,ADL 就会为您找到它。


顺便说一句 - 让你的构造函数参数和它们对应的成员以不同的顺序排列在这里会造成混淆并且容易出错。在统一初始化和上述显式构造函数之间切换需要更改参数顺序,但编译器无法发现这一点。

关于c++ - 使我的结构或类与 std::round 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573950/

相关文章:

c++ - 用户输入文件名打开文件

c++ - 多线程无法按预期工作

javascript - 在 JavaScript 中拉伸(stretch)图形以填充 Canvas 元素

x86 - SSE/AVX 是否提供确定结果是否四舍五入的方法?

c++ - 从 QMenu 中删除图标空间

c++ - 线程在 while 循环中卡住

PHP计算

c++ - 反混淆 C++ 源代码

javascript - 我应该使用 `.toPrecision()` 而不是舍入和求幂吗?

Python 百分比舍入