プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

C++テンプレートテクニック11章 Extension Member Function

ExtensionMemberFunctionについて書かれた章。
あるオブジェクトに対し変更を加えずにメソッドを追加する手法について書かれている。
C++では「.」のオーバーロードが出来ないので演算子「|」を再定義して代用する。
operator|を定義して「対象オブジェクト|関数オブジェクト」という形で呼び出し、さらに戻り値を対象に「|」を重ねて使用できるようにするなど様々なテクニックが紹介されている。

  • result_ofで戻り値の型を取得
  • Boost.Lambdaがすごい
  • Range-baseライブラリはOvenやRangeExなどがある


今まで読んだ部分についてのまとめ

  1. テンプレート前史。マクロを使ってテンプレートもどきを作り、テンプレートの必要性について考える
  2. テンプレートの基礎。文法など
  3. GenericProgrammingの基礎。ヘルパ関数、タグ・ディスパッチ、パラメータ化継承など。
  4. テンプレートメタプログラミング。再起とかコンパイル時ifとか
  5. SFINAE。置き換え失敗をすぐにエラーとせず、推論を続行。sizeofを使って型特性取得したり、enable_ifで型特性による関数オーバーロードを行ったり
  6. ポリシー。処理の切り替え
  7. TypeErasure。仮想関数テーブルを作成する部分では、オブジェクトのポインタとその型のテンプレートメソッドのポインタを保持することで多態性を実現したり、ベースクラスに仮想関数を持つ非クラステンプレート、派生をクラステンプレートにすることで非クラステンプレートのポインタ型にクラステンプレートを保持したり。
  8. CRTP。親クラスが子クラスを知ることで親クラスに仮想関数を用意せず静的な多態性を実現したり、比較などのメソッドを定義する回数を減らしたり(Barton-Nackman trick)
  9. テンプレート型変換演算子。戻り値の型推論とか
  10. ExpressionTemplate。演算子のオーバーロードにより巨大なコピーの削減

参考:

C++テンプレートテクニック

C++テンプレートテクニック