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}这样的初始化器,我将使用它。