3

X と Y の値を保持する 2 次元 (数学) ベクトル クラスを作成したいと考えています。+ などの演算子のオーバーロードを持たせて、コードで数式を簡単に表現できるようにしたいと考えています。このことを考慮:

template <class T>
struct Vector
{
    T x, y;

    inline Vector<T> operator +(const Vector& other) const
    {
        return {x + other.x, y + other.y};
    }
};

ご覧のとおり、return ステートメントで初期化子リストを使用する C++11 の機能を利用しました。ただし、それらはまだ式ではありません。操作を適用することはできません。そして、ここに私の問題があります。クラスをPODにしたい。パラメータを介して x と y を初期化できるように、カスタム コンストラクタを定義することはできません。構築にイニシャライザリストを使用できるため、これは問題ありません。

Vector<int> foo = {1, 2};

ただし、式の中に別の Vector を作成する必要がある場合は使用できません (演算子 * は定義されていませんが、ここでは問題になりません)。

Vector<int> result = (foo + {1, 2}) * 12;

前に述べたように、コンストラクターの代替はオプションではありません。{1, 2} を名前付き変数に格納する以外に、この問題の解決策が思い浮かばないので、これに関する意見をお待ちしております。

4

1 に答える 1

3

最も簡単なオプションは、集計の初期化を使用して一時的なものを作成することです。

Vector<int> result = (foo + Vector<int>{1, 2}) * 12;

あるいは、C++11 のユーザー定義リテラルを使って魔法をかけて、次のようなもの"1,2"_vがオブジェクトの 1 つになるようにすることもできます。

Vector<int> operator "" _v(const char* literal, size_t)
{
  std::stringstream literal_stream(literal);
  Vector<int> vec;
  literal_stream >> vec.x;
  literal_stream.ignore();
  literal_stream >> vec.y;
  return vec;
}

ただし、ここでいくつかのフォーマットチェックを行うことは間違いありません。次に、次のことができます。

Vector<int> result = (foo + "1,2"_v) * 12;
于 2013-01-29T12:50:37.583 に答える