2011-10-19 12 views
19

Dの演算子のオーバーロードの方向について私は混乱していましたが、今ではそれが美しいシステムであることを認識しています...もしコアタイプ(int、floatなど)フォローコードを考えてみましょう:それは働いていた場合エレガントな演算子のオーバーロードD

struct Vector { 
    float X, Y; 

    void opOpAssign(string op)(Vector vector) { 
     X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float 
     Y.opOpAssign!op(vector.Y); // ERROR: ditto 
    } 
} 

これは美しいコードになり、見て、それはすべてのオーバーロードとして+ =、 - =、* =、など。一つの方法で事業者。しかし、あなたが見ることができるように、それは箱の外で動作しません。

テンプレートを使用して解決策を作成しました。これは問題ありません。すべてを「社内」にすることをお勧めします。テンプレートを使用せずにこの作業を行う方法はありますか?私はパフォーマンスの損失がなく、これを行うために必要な状況でモジュールをインポートすることも難しくないので、私はここで気難しく思っています。私はそれが組み込まれていると私は何かを見過ごしているのだろうかと思うだけです。

+0

注:

あなたはここで何をしようとして行うための標準的な方法は、文字列ミックスインを使用することです。もう一度 'static'を繰り返す必要があります。 – Bolpat

答えて

21

ほとんどD内のすべてのオーバーロードされた演算子が定義によってテンプレートです。 void opOpAssign(string op)(Vector vector)には文字列であるテンプレートパラメータがあります。したがって、テンプレート以外の関数としてオーバーロードすることはできません。今、2番目のテンプレートは必要ありません(したがって、テンプレートが必要かどうかを尋ねるとヘルパーテンプレートを意味し、答えはノーです)、オーバーロードされた演算子関数はすでにテンプレートです。静的if`がelse` `後の` if`sを以下に継続しない `という

void opOpAssign(string op)(Vector vector) 
{ 
    mixin("X" ~ op ~ "=vector.X;"); 
    mixin("Y" ~ op ~ "=vector.Y;"); 
} 
+0

すごく速かった!ありがとう! –

13

これはミックスイン

void opOpAssign(string op)(Vector vector) { 
    mixin("X"~op~"=vector.X;"); 
    mixin("Y"~op~"=vector.Y;"); 
} 

これは容易ベクトル

Vector opBinary(string op)(real l)if(op=="*"||op=="/"){ 
    mixin("return Vector(x"~op~"l,y"~op~"l;"); 
} 

Vector opBinaryRight(string op)(real l)if(op=="*"){// for 2 * vec 
    return this*l; 
} 
スケーリング他の算術演算

Vector opBinary(string op)(Vector l)if(op=="+"||op=="-"){//only addition and subtraction makes sense for 2D vectors 
    mixin("return Vector(x"~op~"l.x,y"~op~"l.y;"); 
} 

///take in anything as long as a corresponding binaryOp exists 
///this essentially rewrites all "vec op= variable;" to "vec = vec op variable;" 
void opOpAssign(string op,T)(T l){ 
    this = this.binaryOp!op(l); 
} 

、さらに他へと結合することができる言及しないように組み合わせることを意味します

定義されているopBinaryは、 opOpAssignしかし、あなたは、両方の道を行くことができます(opOpAssignの面でopBinaryを定義)

+0

Johnathanが最初に投稿し、さらに詳しく説明したので、私は彼を答えとしてマークしましたが、すばやく対応してくれてありがとう! –

+0

@FiL私の編集をチェックしてもう少し多くの負荷をかける –

関連する問題