C++ 为点创建文字-C++;

C++ 为点创建文字-C++;,c++,user-defined-literals,C++,User Defined Literals,我正在尝试制作一个简单的库,其中对象是xy轴上的一个点 我希望能够像这样使用文字: a点=(3,4) 其中(3,4)是点文字 我读过关于用户定义的文字,但(据我所知)这似乎是不可能的 可能是“(3,4)”\u p据我所知是可能的 然而,我发现用户定义的文本的有趣用法如下: #include <iostream> #include <complex> int main() { using namespace std::complex_literals; s

我正在尝试制作一个简单的库,其中对象是xy轴上的一个点

我希望能够像这样使用文字:

a点=(3,4)

其中
(3,4)
是点文字

我读过关于用户定义的文字,但(据我所知)这似乎是不可能的

可能是
“(3,4)”\u p
据我所知是可能的

然而,我发现用户定义的文本的有趣用法如下:

#include <iostream>
#include <complex>

int main()
{
    using namespace std::complex_literals;
    std::complex<double> c = 1.0 + 1i;
    std::cout << "abs" << c << " = " << abs(c) << '\n';
}
#包括
#包括
int main()
{
使用名称空间std::complex_文本;
标准:复合物c=1.0+1i;
std::cout您不能自己生成文字,只能为文字创建后缀。如图所示的
1i
或标准语言
f
1.0f
中所示(有关更多信息,请参见示例)

你能做的就是做一些

Point a = { 3, 4 };  // note the use of curly-braces
根据
的要点,您可能需要添加一个合适的构造函数以使其工作。

您不能自己构造文字,只能为文字创建后缀。如图所示
1i
或标准语言
f
1.0f
中所示(有关更多信息,请参见示例)

你能做的就是做一些

Point a = { 3, 4 };  // note the use of curly-braces
根据
的要点,您可能需要添加合适的构造函数以使其工作。

您有3个选项

Point p = { 1,2 };
Point p2{ 1,2 };
Point p3(1,2);
你有3个选择

Point p = { 1,2 };
Point p2{ 1,2 };
Point p3(1,2);
如图所示,最好的方法是使用统一初始化

然而,只是为了好玩,你可以(某种程度上)用用户定义的文字来做这件事。我的想法是每个坐标有2个文字,并在它们之间重载
操作符+
,以创建点

记住,这只是为了好玩,不要在真正的代码中使用:

struct Px { int x; };
struct Py { int y; };

struct Point {
    int x;
    int y;
};

constexpr auto operator""_px(unsigned long long x) -> Px { return Px{(int)x}; }
constexpr auto operator""_py(unsigned long long y) -> Py { return Py{(int)y}; }

constexpr auto operator+(Px x, Py y) -> Point { return Point{x.x, y.y}; }
然后你可以有:

auto p = 3_px + 4_py; // p is deduced to type `Point`
当然,这只是一个粗略的框架。请阅读以了解有关UDL的更多信息。您需要以更好的方式处理缩小的转换,并且propper使用名称空间使其成为更好的解决方案

作为奖励,您还可以使用
运算符,
创建一种更符合您想法的语法。但是,不要这样做,因为重载
运算符,
只是一种罪恶:

auto operator,(Px x, Py y) -> Point { return Point{x.x, y.y}; }
如图所示,最好的方法是使用统一初始化

然而,只是为了好玩,你可以(某种程度上)用用户定义的文字来做这件事。我的想法是每个坐标有2个文字,并在它们之间重载
操作符+
,以创建点

记住,这只是为了好玩,不要在真正的代码中使用:

struct Px { int x; };
struct Py { int y; };

struct Point {
    int x;
    int y;
};

constexpr auto operator""_px(unsigned long long x) -> Px { return Px{(int)x}; }
constexpr auto operator""_py(unsigned long long y) -> Py { return Py{(int)y}; }

constexpr auto operator+(Px x, Py y) -> Point { return Point{x.x, y.y}; }
然后你可以有:

auto p = 3_px + 4_py; // p is deduced to type `Point`
当然,这只是一个粗略的框架。请阅读以了解有关UDL的更多信息。您需要以更好的方式处理缩小的转换,并且propper使用名称空间使其成为更好的解决方案

作为奖励,您还可以使用
运算符,
创建一种更符合您想法的语法。但是,不要这样做,因为重载
运算符,
只是一种罪恶:

auto operator,(Px x, Py y) -> Point { return Point{x.x, y.y}; }

1.0
是一个
double
1i
是一个
std::complex
,定义了一个
操作符+
,它接受这些操作符并产生
std::complex
1.0
是一个
double
1i
是一个
std::complex>
,定义了一个
操作符+
,它接受这些操作符并生成
std::complex
。点是什么意思?它是一个类吗?如果是,请在这里给出它的代码。