C++テンプレートメタプログラミング読み終わった−!

ちょっと文章が直訳っぽくてところどころ不自然だけど,丁寧にBoost.MPLの実装(と使い方)について解説してあってとても分かり易い!
個人的な需要にぴったり合ってたこともあると思うけど,MPLの基本的なことを理解するにはかなり良い内容だと思います.
ただ,表紙の宣伝文句(メタ言語としてのC++がマスターできる)というのはどうみても誇大広告w

(勝手に汲み取った)対象読者

  • テンプレートの振る舞いが一通り分かる(気がする)
  • ModernC++Designに洗脳された
  • MPLを使いこなせているとは言えない

なんという俺!


以下自分なりのダイジェスト.

前半

丁寧なBoost.MPLの解説. この前半の解説が分かり易かった.
書いてあることはMPLのリファレンスとほとんど同じ内容なので,それだけで分かる人はこの本要らないかも.

  • メタ関数転送(継承するだけ)
    • typedefする手間が減る
    • ネストした型を全て把握して無くてもよい
  • mpl::lambda, mpl::placeholderの素朴な実装
  • メタ関数を適用するときは(自分で適用しないで)mpl::applyを通す
  • MPLの拡張方法
    • メタ関数のネストしたapplyテンプレートを特殊化する
  • mpl::inserterはfoldr

後半(view辺りから)

メタプログラミングのランタイムプログラミングへの応用技法の紹介.
いろんな手法が紹介されてるけど,ちょっと説明が雑になってくる.
まともに解説してたら絶対ページ足りないからしょうがないんだけど.

  • CRTPで基底クラス内に定義したfriend関数はADLでしか見つからない
  • 過度に一般的なテンプレートの記述を防ぐために, CRTPの基底クラスを関数の引数にとる
template<class Derived> struct vehicle {};
template<class Derived> struct screw {};

class Vehicle: public vechicle<Vehicle> { /* ほげほげ */ }; // 本命クラス
class Screw  : public screw<Screw>      { /* ほげほげ */ }; // 本命クラス

template<class Vehicle>
void drive(vehicle<Vehicle> const & v) {  // 安全にダウンキャストして使う
	Vehicle const & v_ = static_cast<Vehicle const&>(v);
}
template<class Screw>
void drive(screw<Screw> const & s) {  // 安全にダウンキャストして使う
	Screw const & s_ = static_cast<Screw const&>(v);
}
  • type erasureもちょっと出てきた(普通なので略)
  • 型リストを継承していく構造(代数的階層?)

Modernで見た気がする. 継承ツリーの任意の場所へのアクセッサが面白い.

typedef fold<vector<int,char*,long,short[2]>, empty, store<_2, _1> > generated;
template<class T, class U>
store<T,U> const & get(store<T,U> const & e) {
	return e; // これだけ
}
char * s = get<char*>(generated).value; // char*の階層にマッチする!w

その他

  • 誤字が多い(気がする)
  • 基底クラスに言及しようとしてると思い付かない
template<class T>
struct derived : base<typename whatever<T>::type>
{
	// typedef base<typename whatever<T>::type> base_; // 不要
	// typedef typename base_::value_type value_type;
	typedef typename derived::base_; // これで一発
};
  • 文中で何回も言及されてるので紹介

間接法をもう一段増やせば解けない問題はない.
Burler Lampson

個人的にはこの言葉からそんなに深いものを読み取れないんだけど….理解が足りない?

  • 巻末付録にコンパイラのメタプログラムパフォーマンスが比較されてて面白い
    • ComeauC++の振る舞いが謎w

まとめ

  • 日本語の文章としては読みづらい部分がある
    • コードが多いからさほど気にならない気もする
  • MPLの説明としてはかなり分かり易い
  • 他はちょっとした解説付きのイディオム集な部分もある
    • 実践的な応用はそんなに無い(もしくは詳しくない)


ツボにはまればヒットかも知れない.

C++テンプレートメタプログラミング (Programmer’s SELECTION)

C++テンプレートメタプログラミング (Programmer’s SELECTION)