用于双参数构造函数的用户定义文字

时间:2014-02-24 19:33:18

标签: 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的字面值,然后在运算符主体中进行一些数学运算,将整个部分与浮点数的小数部分分开..?

2 个答案:

答案 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之类的内容,则可能希望y23,但这会改为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);有什么问题?