macroを使ってopを実装する
TL;DR
構造体に対して演算子を実装するときに、マクロを使わないとすごく長くなるのでマクロの使い方についてまとめておく。
macroの基本
マクロの引数は
| 意味 | 例 | |
|---|---|---|
| block | ブロック | |
| expr | 式 | 1+1 |
| stmt | 文 | |
| pat | パターン | |
| ty | 型 | |
| ident | 識別子 | |
| path | 修飾された名前。 | T::deafult |
| tt | 単一のトークン木 | だいたいなんでも。演算子もここ。 |
| meta | アトリビュートの中身。 | cfg(target_os = "windows") |
で、今回使うのはidentとtt。ポイントは演算子を入れる引数はttが使えるということ。RFC#426とかでop用の引数を作ろうみたいな話もあるらしいが、特に進んでなさそう。例えば以下のような感じで演算子を使える。
今回は以下のような単純な構造体を考える。
これに対して、Point<T>と<T>に関する四則演算を定義する。
例えば、Addの場合は以下のようになる。
これらの処理は他の四則演算においてもだいたい同じコードなのでマクロでまとめたい。基本的には必要なtraitと、traitに必要な関数名、演算子を指定すればいい。
演算子をどう使えばいいのかわからなかったのでメモがてらまとめておいた。