演算子のオーバーロード #5(完結編)

ちょっと間が空いた。

さて、ここまでを踏まえれば、最初の記事に載せた

http://stackoverflow.com/questions/11150947/f-overloaded-operater-with-floats-not-working-with-other-floats/11152288#11152288

はほぼ理解できる。

  • 組み込みのfloatとユーザー定義のvector2の両方で使えるように、2項演算子 *=オーバーロードしたい
  • しかし、float同士の*=演算を、後付けで定義することができない
  • そこで、以下のハックを使う
    • ユーザー定義型 Overloadsに、3項演算子 ?<-を定義する
    • その演算子は、Overloads型の値を1つ、=演算子を適用したい型の値を2つ受け取るが、Overloads型の値は捨ててしまい、本来やりたかった=演算だけを実装する
  • 以上の準備ができたなら、グローバルレベルでのインライン演算子定義で、*=を実装し、Overloads型の?<-演算子にぶん投げる
    • Overloads型の値は演算子オーバーロードの解決に使われた後は捨てられるので、unit的に値が1つしかない型で十分。よって、Overloads型は値が1つしかない判別共用体として定義してもいい。

なんとまあ。分かってしまえば何ということはなかった。?<-を使っているのは単にそれが3項演算子だからってだけのようだし、Overloads型が値が1つしかない判別共用体であることにも大きな意味はなかった。