鉴于以下情况,我如何使我的类或结构与 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;
}
最佳答案
你不能制作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/