異なる型の演算

以前異なる型の演算した結果の型をどう推測すべきか疑問にした。http://d.hatena.ne.jp/ototoi/20030604#p3
そこでは解決策としてexpression templateを挙げたのだが、実装してみると、expression templateもその問題に縛られてしまうことが分かった。
昨日「プログラミング言語C++」を読んでいたら、その付録に組み込み型における算術変換の規則*1が載っていた。それを読むと、どうやら変換規則は演算対象となる変数またはリテラルのその「値」は関係なく、その「型」によってのみ決まるようだ。これはテンプレートによって推測可能である事を示す。
そこで実装してみました。コードは例によって「避難場所」に置きました。
使うには以下のようにします。

operation_result::type a;// -> double a;

いくつかの型で試した所、僕が試した限りでは正しい挙動を示した。

constやvolatile、それから参照&については考えなかった。これらは算術演算には関係がない為で、事前に取り除く必要がある。
また組み込み以外の型についてはその型の実装によって演算結果の型が変わるため、これも考えなかった。この事も考えた場合、さらに変換規則を考慮しテンプレートを書く必要がある。
以上2つは仕様としていいと思う。
今回はlong longと_int64については考慮しなかった。



今回のテンプレートを書く前に一通りboostを眺めたのだが、同様のものは見つからなかった。結構一般的に広く使えると思うのだが、どういうわけだろう?この日記を読まれた方で理由が分かる方いらっしゃったら教えてください*2

*1:C.6.1格上げ,C.6.3通常の算術変換

*2:さもないと僕が珍妙な英語でboostチームにメールを出して、日本の恥をさらすかもしれません。