*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



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS