为点创建文字 - C++
creating a literal for a Point - C++
我正在尝试做一个简单的库,其中对象是 xy 轴上的一个点。
我希望能够像这样使用文字:
Point a = (3,4);
其中 (3,4)
是点文字。
我阅读了有关用户定义文字的内容,但是(据我了解)这似乎是不可能的。
据我了解可能"(3,4)"_P
是可能的。
但是,我在 this page 上发现用户定义文字的有趣用法如下:
#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';
}
我可以将 1i
部分理解为用户定义的文字,但不能理解全部内容 1.0 + 1i
。
我缺少什么,以及在不使用 "
.
的情况下获得类似于 (x,y)
的文字的最接近可能的方法是什么
你不能自己构造文字,只能为文字创建后缀。就像显示的1i
或1.0f
中的标准语言f
。 (参见 this user-defined literal reference 了解更多信息。)
你可以做的是使用uniform initialization做类似
的事情
Point a = { 3, 4 }; // note the use of curly-braces
根据 Point
是什么,您可能需要添加合适的构造函数才能使其正常工作。
您有 3 个选项
Point p = { 1,2 };
Point p2{ 1,2 };
Point p3(1,2);
如所示,最好的方法是使用统一初始化。
但是,只是为了好玩,您可以(某种程度上)使用用户定义的文字来做到这一点。我的想法是为每个坐标设置 2 个文字,并在它们之间重载 operator+
以创建点。
记住,这只是为了好玩,不要在实际代码中使用它:
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`
当然这只是一个粗略的框架。阅读 this great article 以了解有关 UDL 的更多信息。您需要以更好的方式处理缩小转换,并适当使用名称空间使其成为更好的解决方案。
作为奖励,您还可以使用 operator,
来创建更适合您的想法的语法。但是,不要这样做,因为重载 operator,
是邪恶的:
auto operator,(Px x, Py y) -> Point { return Point{x.x, y.y}; }
auto p = (2_px, 1_py); // p is deduced to type `Point`
我正在尝试做一个简单的库,其中对象是 xy 轴上的一个点。
我希望能够像这样使用文字:
Point a = (3,4);
其中 (3,4)
是点文字。
我阅读了有关用户定义文字的内容,但是(据我了解)这似乎是不可能的。
据我了解可能"(3,4)"_P
是可能的。
但是,我在 this page 上发现用户定义文字的有趣用法如下:
#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';
}
我可以将 1i
部分理解为用户定义的文字,但不能理解全部内容 1.0 + 1i
。
我缺少什么,以及在不使用 "
.
(x,y)
的文字的最接近可能的方法是什么
你不能自己构造文字,只能为文字创建后缀。就像显示的1i
或1.0f
中的标准语言f
。 (参见 this user-defined literal reference 了解更多信息。)
你可以做的是使用uniform initialization做类似
的事情Point a = { 3, 4 }; // note the use of curly-braces
根据 Point
是什么,您可能需要添加合适的构造函数才能使其正常工作。
您有 3 个选项
Point p = { 1,2 };
Point p2{ 1,2 };
Point p3(1,2);
如
但是,只是为了好玩,您可以(某种程度上)使用用户定义的文字来做到这一点。我的想法是为每个坐标设置 2 个文字,并在它们之间重载 operator+
以创建点。
记住,这只是为了好玩,不要在实际代码中使用它:
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`
当然这只是一个粗略的框架。阅读 this great article 以了解有关 UDL 的更多信息。您需要以更好的方式处理缩小转换,并适当使用名称空间使其成为更好的解决方案。
作为奖励,您还可以使用 operator,
来创建更适合您的想法的语法。但是,不要这样做,因为重载 operator,
是邪恶的:
auto operator,(Px x, Py y) -> Point { return Point{x.x, y.y}; }
auto p = (2_px, 1_py); // p is deduced to type `Point`