双参数构造函数的用户定义文本
User-Defined Literal for Two-Argument Constructor
请考虑以下代码:
#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 << "nn";
return 0;
}
UDL是有效的,但有可能使它同时适用于Point构造函数的两个参数吗?例如,3x5
是Point(3,5)
甚至3.5x
的文字,然后在运算符体中进行一些数学运算,将浮点运算的小数部分与整个部分分离。。?
首先,请注意,为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
以外的东西进行解析。我只是快速地将其组合在一起,以显示语法,而不是作为字符串解析教程。
可能通过重载任意运算符:
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);
怎么了?
相关文章:
- C++编程从外部文本文件定义数组大小
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 无法在模板参数中定义字符串文本
- 如何在C++中将自定义文本设置为 QLabel?
- 在 cout 中将线条表单文件与自定义文本组合时出现问题
- 是否可以在运行时调用用于选择要调用的用户定义文本的逻辑?
- 使用用户定义文本的成员时出现编译错误
- 双参数构造函数的用户定义文本
- 自定义文本到语音转换中的语音
- QTextEdit中的自定义文本(代码)区域
- 预处理一个自定义文本文件,以使用Boost Spirit删除注释
- 在自定义文本区域中呈现光标的正确方法
- 制作参数化用户定义文本的任何方法
- 是否可以对基于字符串的用户定义文本进行强类型化
- 如何创建自定义文本编辑器
- 自定义文本框:高亮显示和选择
- 更改自定义文本C++的颜色
- Win32自定义文本框
- OpenFileDialog C#显示自定义文本
- 如何在QTextEdit中设置自定义文本颜色