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

Rob*_*son 0 c++ math rounding

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

C++ Shell版本

#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;
}
Run Code Online (Sandbox Code Playgroud)

Use*_*ess 5

你不能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) };
}
Run Code Online (Sandbox Code Playgroud)

同样,将此添加到命名空间std是非法的.只需确保它与Rectangle自身位于同一名称空间,ADL就会为您找到它.


除此之外 - 让你的构造函数参数和它们对应的成员对应的命令不同,这里容易引起混淆和容易出错.在统一初始化和上面的显式构造函数之间切换需要更改参数顺序,但编译器无法发现它.