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または標準言語のfように1.0f。(詳細については、このユーザー定義リテラル リファレンスなどを参照してください。)

できることは、次のような均一な初期化を使用することです

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

内容によってPointは、適切なコンストラクターを追加して機能させる必要がある場合があります。

于 2017-06-08T11:26:37.013 に答える