gpt4 book ai didi

c++ - 双参数构造函数的用户定义文字

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:39 25 4
gpt4 key购买 nike

请考虑以下代码:

#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 的构造函数的两个参数都有效?例如3x5Point(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 的内容,您可能希望 y23,但这会得到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com