- 追加された行はこの色です。
- 削除された行はこの色です。
*C++テンプレートメタプログラミング(MPL)とは? [#k6f6be16]
テンプレートメタプログラミングとは、C++のテンプレート(template)を使って、コンパイル時に様々な処理を行ってしまうテクニックです。
**テンプレートメタプログラミングのメリット [#m1fd9729]
+ビルド時に処理されるため、エラーや不具合を実行時まで持ち越さない -- ビルド時でバッギングが可能
+テンプレートによって実現されるため、実行速度が速い。-- マクロが展開されるため最適化されやすい
+ユーザーが作ったクラスをプラグインしたり、機能拡張が容易 -- 拡張しても処理速度は落ちない
+通常のプログラミングでは非常に困難な処理を実現できる -- たとえば、コードジェネレーターのような機能も実現可能
**テンプレートメタプログラミングのデメリット [#sc3a4f8b]
+ビルド時間が長くなる -- コーディングとデバッグのサイクルがしんどくなる
+エラーメッセージが意味不明 -- コンパイラに頑張ってほしいです
+難解なコードになりがち -- 綺麗に書けばなんとか読めます
**テンプレートメタプログラミングの例 [#t680973b]
簡単な例をいくつか紹介します
- 条件によって変数の型を変える
if_c <[条件], [真の場合], [偽の場合]>
この"if_c"を使って、要素が固定されているデータ配列があり、通常はstd::vector<>を使って実装したいが、要素が1個の場合は単独の定義としたいというHogeClassの実装を行ってみます。
template <size_t N, typename DataType>
struct HogeClass {
typedef if_c<N==1, DataType, std::vector<DataType> >::type type;
};
例:
HogeClass<1, std::string>::type singleString;
HogeClass<5, std::string>::type vectorString;
if_cの定義
template <bool C, typename T, typename F> struct if_c { typedef T type; };
template <typename T, typename F > struct if_c<false,T,F> { typedef F type; };
#back