鉴于以下内容,如何使我的类或结构与std :: round兼容?(我假设同样的事情会使它与std :: floor和std :: ceil一起使用).我可以这样做吗?
#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)
你不能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就会为您找到它.
除此之外 - 让你的构造函数参数和它们对应的成员对应的命令不同,这里容易引起混淆和容易出错.在统一初始化和上面的显式构造函数之间切换需要更改参数顺序,但编译器无法发现它.