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

标签 c++ c++11 operator-overloading user-defined-literals

请考虑以下代码:

#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/

相关文章:

c++ - 如何将位图拉伸(stretch)到父面板中(wxWidgets 自定义)

c++ - 即使我将单个节点设置为 NULL 并删除它们,递归清除二叉树也不起作用

c++ - 为什么友元运算符<<在某些情况下使用而在其他情况下不使用

c++ - 我想看看一个字符是否存在于字符串中

c++ - 执行 a.out 文件 (C++) MacOS Sierra 10.12.1 时出现问题

c++ - 动态更改文本 qlabel

c++ - 在 switch case 中声明变量(子类别的枚举) - 什么是替代方案?

c++ - 零初始化的 std::atomic<T*> 是否保证等同于用 nullptr 初始化的?

C++ 编译器对重载 << 运算符有矛盾的提示

c++ - 分配运算符(operator)在圆形双向链表中无法正常工作