最終更新: 2013/9/18
数値型のプログラミング
柏木 雅英
精度保証付き数値計算では、自動微分などそれ以外の「数値っぽい振る舞いをする型」
を自作する必要がある。
特に自作型を入れ子にする場合など、注意すべき点も多い。
まだちゃんと文書化していないが、とりあえずまとめておく。
まず、古い情報だが、
数値型のプログラミング (以前のやり方)
を見て欲しい。
基本的にこれと同様なのだが、この方法の欠点は、
-
引数一つのコンストラクタに "explicit" がついていないため、野放図な
自動型変換が可能になってしまい、予想もしない動作を引き起こすことがある。
という点にある。引数一つのコンストラクタは型変換関数として使われるが、
explicitキーワードを付加すると明示的にキャストしない限り自動型変換が
行われなくなる。
上記文書の3.3で使っている "is_convertible" は残念ながらexplicitな
コンストラクタが存在しても判定結果がfalseになってしまう。
C++11から登場した "is_constructible" を使うとこれが判定できるが、
まだC++11に対応したコンパイラは少なく、時期尚早と判断した。
そこで、全ての引数一つのコンストラクタはexplicitにする一方、
内部型として受け入れられるかどうかは自前で判定することにした。
このメモのような方針になっている。