Rokiのチラ裏

学生による学習のログ

non-type template parameter におけるデータの受け渡しから TMP で実数を含む value computing を行う

push してからしばらく経っているが記録もかねて。C++ の non-type template parameter には浮動小数点型などの数値を直接与えることはできない。しかし、型の内部に内包させて Expression templates のようにその値を取り出そうとした瞬間に型情報に紐付いている式の形を展開させられれば実質 template arguments を利用してでも浮動小数点数値を受け渡し、かつ value computing を行う事ができる。基本的に、TMP はそれを純粋関数型言語とみなして記述するので*1、式の形を保持しておき遅延評価を行うという解はまぁ当然と言える。実装そのものはそこそこ小さくまとまっていると思われる。これを利用すると、以下のように浮動小数点などの値を non-type template parameter 経由で扱うことができる。

一応 Polish Notation と infix notation 的な両記法をサポートしているようなつもりでいる。上記のコードは特別意味のある計算をしていないが、例えばこれを使えば理論的には TMP によるコンパイルマンデルブロ集合を得る事ができたりする(コンパイル時Cコンパイラがあるので不思議な事ではないが)。

しかし残念ながらこのコードは実際には動かない。コード中冒頭のコメントにもあるとおり、メモリを大量に食い尽くしてしまうからだ。浮動小数点計算を non-type template parameter 経由で行えるようにしたところで特別何か使い道も思いつかないのだが、例えばコンパイル時にコサインテーブルを生成するぐらいであれば容易にできる。実際フルスクラッチで以前に書いた JPEG エンコーダ/デコーダのコサインテーブルはそれを利用している

*1:この辺りの C++ TMP における無駄な活用については any_packTMPによるコンパイル時乱数アルゴリズムの実装TMPによる四則演算パーサ等を参照されたい