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

C++テンプレートテクニック
帯の殺し文句がシブい「これが templateの使い方だ」
この帯の通り、「C++の最も濃い部分、テンプレート」の話がてんこ盛り。テンプレートの話が中心ということで必然的に、STLと、Boostと、TR1の話(C++0xも含む)が中心で、オブジェクト指向がどう、とか、そんな初心者向けの話は一切無い(だって、templateの話だし)
途中までだけど、忘れないうちに各章の感想を(いろいろ衝撃を受けたので)メモとして残すことにする

Chapter 1 テンプレート前史

これは著者(επιστημηさん)の他の著書でも述べられている話。重複はあるが、これから話す内容の前提知識としてかつてのマクロの問題点が軽く触れられている。

Chapter 2 テンプレートの基礎

文法的な話。ざっくりとしたテンプレートの作り方、インスタンス化の仕方について

Chapter 3 Generic Programmingの基礎

STLの使い方、自分は恥ずかしながら、この辺から既に怪しい。タグディスパッチとか初めて知りました(恥ずかしい)
タグディスパッチ、を、簡単に言うと、Win32とかだと、マクロ(プリプロセッサ)を使って関数名の切り替え(unicode周辺とか)をしていたのを、テンプレート(コンパイラ)の仕事にするための方法、と理解した。(あってるかね?)

Chapter 4 テンプレートメタプログラミング

テンプレートを使ったメタプログラミングの説明、だが、、説明を読めば読むほどLispに見えてくる。C++だと思わず「テンプレート」という名前の関数型言語の方言だと思った方が解釈しやすいかも。ここから著者がスイッチしている(高橋晶さん)。

Chapter 5 SFINAE

SFINAEというコンパイラが同じ名前の関数を置き換えできなかった場合に違う候補を探すルール(こう書くと分かりづらいね)についての説明。「テンプレートメタプログラミング」の世界ではコンパイルするまでで勝負が決まるのと、「同じ名前に違う意味を持たせる」というポリモルフィズムを実現するための礎となる大事な話、(なのに、理解していませんでした、なんとなくコンパイラが探してくれるんだろうなぐらいの理解でした。というわけでもの凄く勉強になった)

Chapter 6 ポリシー

「Modern C++ Desgin」では、最初の章に出てくるポリシーの話。正直に告白すると、初めてこの本で理解できた気がする。javaで言うところのInterfaceみたいなことを、C++でやるための仕組み、というと当たらずも遠からずという気がする。宣言と定義と実装をそれぞれ独立させることで(ここでも共通の名前でメンバ変数を定義し、実装で異なる動きをさせる、というポリモルフィズムが活きてくる)「ポリシークラスは柔軟なクラス設計を実現する」の言葉の意味が分かった気がする。

Chapter 7 Type Erasure

この辺からかなり苦しくなる。この章で言っていることは任意の型のオブジェクトに対して振る舞えるような関数の定義の方法(単純に考えると、全てのオブジェクトをvoid *で受け取れば良さそうだが、その場合の問題点の整理から話は始まる)これまでの章のSFINAEや、タグディスパッチなどの話題も出てくる。とにかく読むのに骨が折れた。vtblを自作する話とかが出てくるあたり、初心者相手じゃないぞ、というC++玄人臭が漂う。後半で出てくる、Boostの場合での実装例がありがたい、これを見てようやく理解が追いついた感がある。基本的にはやっぱり、ポリモルフィズムな振る舞いをさせるための話なのだが、自分が知っていた「ポリモルフィズム」が少しづつ揺らいだ感じすらした、

Chapter 8 CRTP

仮想関数(virtualで宣言した関数)を使用しないで「静的な多態性」を実現するというスゴい話。確かにこの機能を使うと、ソース上から、virtualが消えるどころか、一気に継承元(ベースクラス)から継承先(サブクラス)のメンバ関数を呼んでいる。これにはかなり驚いた。こんなことまでできるのか。(C++使いにはフツーなのか?これ?コンパイル時に継承元で同名の関数が展開されるのだろうが、スゴいですよ、とは思ったもののサンプル呼んで、、へぇ、、という感じで具体的な使い道は自分の頭では思いつかなかった、普通にvirtualな関数書いて継承でも、、いいような俺はヘタレかも知れん。)
Barton-Nackman trickという話(==を定義すれば、!=は自動生成させられる、という数学的な話)にも触れてある。久しぶりにポリモルフィズムじゃない話で(話自体は簡単なので)読みやすくて嬉しい(笑)

Chapter 9 テンプレート型変換演算子

ここから先は、未読。

Chapter 10 Expression Template

未読

Chapter 11 Extension Member Function

未読

Chapter 12 C++0xにおけるテンプレート

途中まで読んだが。。。未読。



この連休中に最後まで読みたかったが、残念ながらいろいろあって最後まで読めなかった。ページをめくるたびに目からウロコと涙がポロポロ落ちてくる。殆どの項目に新発見があるというか、自分の理解の浅さを痛感したり、まぁ読むのに時間がかかりました。
いやー、改めてC++の変態的な部分、というか、多態の実現方法について、多態すぎというか、とにかくお腹いっぱいになる。変態過ぎて付き合いきれん、と思う人もいるかもしれませんが近くに寄ってよく見ると面白い言語ですよ。と語りかけられているかのような錯覚が、気がつけばtemplate ...で始まるコードがcoolに見えてくるから不思議だ。C++のそんな魅力を再発見してくれる良書だと思います(著者の方々に感謝!)
自分は一度、Modern C++ Designでつまづいた苦い過去がありますが(手を出したときがあまりに知識不足過ぎたのかもしれないけど)、これなら!と思える易しい説明が各所にあり大変な労作だと思いました。