请考虑以下代码:
#include <iostream>
class Point
{
public:
int x,y;
Point(int newx, int newy) : x(newx), y(newy) {}
};
Point operator"" x(const unsigned long long i)
{
return Point(i, 0);
}
int main()
{
Point p = 5x;
std::cout << "\npoint is " << p.x << "," << p.y << "\n\n";
return 0;
}
UDL 有效,但是否有可能让它对 Point 的构造函数的两个参数都有效?例如3x5
是 Point(3,5)
或什至 3.5x
的文字,然后在运算符主体中进行一些数学运算以将整体分开部分来自 float 的小数部分..?
最佳答案
首先,请注意您为 UDL 指定的名称必须以下划线开头。
是的,这是可能的,但您是否真的想这样做可能会受到质疑。
Point operator"" _x(long double x) {
return Point(floor(x), (x-floor(x))*10);
}
int main(){
auto p = 3.5_x;
}
至于为什么你不想。现在,这会固定乘以 10,将 float 的小数部分变成整数。如果您输入类似 1.23
的内容,您可能希望 y
为 23
,但这会得到 2.3
。
更糟糕的是,您在源代码中给出的数字可能很容易变成二进制的重复数字,因此几乎没有办法从 float 的小数部分开始并确保您生成的是最初想要的.
以这种方式使用 float 似乎也缺乏一种合理的方式来表示像 (3, -5)
这样的点。输入只允许一个符号代表整个数字。
您可以将其定义为取一个字符串,然后在运行时解析该字符串以生成正确的值。
auto p = "3x5"_x;
不过,大多数人不太喜欢这个选项。必须将输入括在引号中会破坏事情。如果您无论如何都想这样做,代码将如下所示:
Point operator"" _x(char const * const s, unsigned long long len) {
int x, y;
sscanf(s, "%dx%d", &x, &y);
return Point(x, y);
}
当然,您可能更喜欢使用 sscanf
以外的其他方式进行解析。我只是快速地将其组合在一起以显示语法,而不是作为字符串解析教程。
关于c++ - 双参数构造函数的用户定义文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21997204/