Eyes, JAPAN Blog > C++ テンプレートメタプログラミング入門

C++ テンプレートメタプログラミング入門

Eyes, JAPAN Blog 編集部

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

こんにちは。アルバイトの石井です。
今回はテンプレートメタプログラミングについて書きたいと思います。

テンプレートメタプログラミングとは、テンプレートのインスタンス化を利用して、コンパイル時に処理を行うための手法です。
テンプレートメタプログラミングはコンパイル時にすべて評価されるので、変数や実行時の制御構造は用いることができません。
使えるものは定数とメタ関数のみで、この2つと言語仕様を組み合わせて書いていきます。
今回はテンプレートメタプログラミングの「Hello World」と言われているものを解説していきます。

それが、こちらです。

無題
こちらは「再帰テンプレート」と「テンプレートの(明示的)特殊化」の2つを用いて階乗値をコンパイル時に計算しているものです。
再帰的に値を算出し、一番下の桁「0」で特殊化によって value = 1 となり、そこから求めたい階乗値を計算します。
感覚的には ループ:再起テンプレート 条件分岐:特殊化 で覚えるのが最適です。

テンプレートを用いると、どうしても読みにくい問題が発生してしまいます。
この問題を解決する手法として「constexpr」というキーワードがあります。
「constexpr」とはコンパイル時定数のことです。(constは実行時定数)

これを用いて同様の処理を書こうとするとこうなります。(比較のためテンプレート版も記載)

無題1
おそらく、先ほどのプログラムより見やすいと思います。
ループ:再帰関数 条件分岐:三項演算子 で行っています。
テンプレートを用いるときと同様、制約が多いです(C++14で緩和されている)。

今回はテンプレートメタプログラミング入門のあたりについて触れましたが、実用性に関しては膨大な計算量を必要とするプログラム程度にしかないと思います。
個人的には遊び・娯楽の一環として色々な数式を実装して遊んでいます。

もしコンパイル時処理などに興味を持ちましたら、ぜひ調べてみてください。

Comments are closed.