1

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

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

Point a = (3,4);

(3,4)点文字在哪里。

我读到了用户定义的文字,但是(据我所知)这似乎是不可能的。

据我了解,可能"(3,4)"_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';
}

我可以将部分1i理解为用户定义的文字,但不是全部1.0 + 1i

我缺少什么,以及在(x,y)不使用".

4

3 回答 3

3

正如一些程序员老兄所说,最好的方法是使用统一初始化。

但是,只是为了好玩,您可以(在某种程度上)使用用户定义的文字来做到这一点。我的想法是为每个坐标设置 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`

当然这只是一个粗略的框架。阅读这篇精彩的文章以了解有关 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`
于 2017-06-08T11:38:12.220 回答
2

不能自己组成文字,只能为文字创建后缀。如所示1i或标准语言f1.0f. (有关更多信息,请参见此用户定义的文字参考。)

可以做的是使用统一初始化做类似的事情

Point a = { 3, 4 };  // note the use of curly-braces

根据Point您可能需要添加合适的构造函数以使其工作。

于 2017-06-08T11:26:37.013 回答
0

你有3个选项

Point p = { 1,2 };
Point p2{ 1,2 };
Point p3(1,2);
于 2017-06-08T11:31:23.333 回答