请考虑以下代码:
#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
的字面值,然后在运算符主体中进行一些数学运算,将整个部分与浮点数的小数部分分开..?
答案 0 :(得分:2)
首先,请注意您为UDL提供的名称必须以下划线开头。
是的,这是可能的,但你是否真的愿意这样做可能会有疑问。
Point operator"" _x(long double x) {
return Point(floor(x), (x-floor(x))*10);
}
int main(){
auto p = 3.5_x;
}
至于为什么你不想这样做。现在,这将固定乘以10,将浮点数的小数部分转换为整数。如果您添加1.23
之类的内容,则可能希望y
为23
,但这会改为2.3
。
更糟糕的是,您在源代码中提供的数字很容易变成二进制的重复数字,因此几乎没有办法从浮点数的小数部分开始,并确保您正在生成最初的意图
这种方式使用浮点数似乎也缺乏一种合理的方式来表示像(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
之外的其他内容进行解析。我只是快速地将它们拼凑在一起以显示语法,而不是作为字符串解析的教程。
答案 1 :(得分:1)
可能通过重载一些任意的运算符:
class Point
{
public:
int x,y;
Point(int newx, int newy) : x(newx), y(newy) {}
};
Point operator&(Point p1, Point p2)
{
return Point(p1.x, p2.y);
}
Point operator"" _x(const unsigned long long i)
{
return Point(i, 0);
}
Point operator"" _y(const unsigned long long i)
{
return Point(0, i);
}
用法:
Point p = 5_x & 42_y;
但严重的是,我认为这样做没有意义,至少打字更多。好老Point(x,y);
有什么问题?