friend bool operator<(const X&lhs,const X&rhs)って構文をboost::operatorsを見て初めて知った
先日ふと
「std::tieがあるのでこれを使って9割自動比較演算子のオーバーロードを作ろう」とか考えまして、途中で「boost::operatorsでいいじゃん」と気が付きまして
boost::operatorsってのは演算子の自動生成装置でして
例えばoperator<を定義しておけばoperator>,operator<=,operator>=が定義されるなど便利なもんです
コストは調べたところほぼ0(関数呼び出しのオーバーヘッドがあるかもしれないくらい?)
使い方はほかに任せるとして
これの原理は
- operator<が定義され,boost::operators<C>を継承したCがあるとして
- x>y (C x,y)をすると
- まずCにoperator>がないことを確認し
- 親クラスからfriend bool operator<(const T&lhs,const T&rhs) (class T=C)を見つけそれを実行する
ざっくりいうとこういうことらしい
boost\operators.hppの中はほかにもいろんなことが書いてあるんだけれど魔境過ぎて読めなかったよ
で,肝心要のoperator<の実装は
std::tie(a,b,c) < std::tie(rhs.a, rhs.b, rhs.c);
ってやれば一行で終わるねやったね凄いねっていう話でした