C++ 双参数构造函数的用户定义文字 请考虑以下代码: #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; } #包括 类点 { 公众: int x,y; 点(intnewx,intnewy):x(newx),y(newy){ }; 点运算符“”x(常量无符号长i) { 返回点(i,0); } int main() { 点p=5x; std::cout

C++ 双参数构造函数的用户定义文字 请考虑以下代码: #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; } #包括 类点 { 公众: int x,y; 点(intnewx,intnewy):x(newx),y(newy){ }; 点运算符“”x(常量无符号长i) { 返回点(i,0); } int main() { 点p=5x; std::cout,c++,c++11,operator-overloading,user-defined-literals,C++,C++11,Operator Overloading,User Defined Literals,可能通过重载某些任意运算符: 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

可能通过重载某些任意运算符:

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;

但是说真的,我认为这样做没有什么意义,至少更需要打字。好的旧
点(x,y);
有什么错?

首先,请注意,您为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
以外的其他方法进行解析。我只是快速地将其组合起来以显示语法,而不是作为字符串解析的教程。

使用聚合初始化,例如
点p={3,5}
。IMO比一些intransparant literal好得多。@Paranaix我不知道你能做到这一点!这是c++11中的一个新功能吗?@1.618在一般情况下,是的(就像UDL一样);这叫做列表初始化。但是如果你从类中删除所有构造函数(对于如此简单的结构,这可能是合理的),大括号被解释为聚合初始化,它从C++98开始工作。关键是需要C++11编译器的
k0ln3z
因素。你的字符串示例就是我最初想到的。但是现在我知道我可以使用像{3,5}这样的初始化器,我将使用它。