前回は商のみを求めましたが、今回は余りも求めることにします。

商と余りなので、標準ライブラリのdiv_t等の型を使いたいところですが、テンプレート化しにくいですし、符合無し整数型も扱えませんので、独自にクラステンプレートを定義することにしました。

例によってC++98以降で使えるようにはしましたが、is_integralにはTR1かBoost C++ Librariesを使うようにしてください。C++11以降なら標準ライブラリだけでOKです。使っているのはassertの引数だけなのでNDEBUGマクロを定義すれば標準ライブラリの範囲で大丈夫でしょう。

境界値のチェックはやっていませんのでオーバーフローが起きると未定義の動作になりますが、とりあえずこれで動作します。

以前のWebサイトには定数式にするためのメタ関数も掲載していたのですが、C++14以降ならconstexprを付けるだけで済みます。C++11のconstexprは制限が多いのでもう一工夫必要になります(今回は掲載しません)。


元ネタ

↑ 1. 整数型に関するテンプレート