久しぶりの読書感想文ですよっと。
今回から13回に分けて紹介するのはC++テンプレートテクニック。επιστημη/高橋晶著です。
光栄な事に長月は本書の査読に参加させていただいていて、見本をいただいているので世間に出る一足先に、世界一早い内容のレビューをお送りします。(他の査読者の方々まだレビューしてないですよね? どきどきw)
今回扱うのは第一章。生き字引επιさんが書くC++がテンプレートに至る経緯のお話です。
本章はテンプレートによる多彩なテクニックの紹介に先駆けて、C++の昔話と言えばεπιστημηというぐらいC++の昔話に定評のあるεπιさんが、なぜC++にテンプレートが導入されたのか、その問いの答えにつながるテンプレート以前のC++で作られたコンテナのあり方と、なぜそれに不満があったのかを解説しています。
第一章の最初ではC++で使われたSmalltlk風コンテナがどういった物かを解説しています。Smalltalk風のコンテナとは、Object型を根に持ついわゆるピュアOOなオブジェクト階層を利用した物ですね。OOPに傾倒したならC++に限らず一度は通る道です。
C/初期C++で汎用のコンテナを作成する場合、究極的にはvoid*のコレクションにたどり着きます。たとえそれが他のOOPLに見られるObject型を根にした継承階層を利用した物であっても、本質的にvoid*から離れられていません。キャストでいっぱいのコードを見たことありませんか?
void*の呪縛から解き放たれるために必要と考えられたのがAdaで言う汎用体の様な総称型プログラミングの概念でした。
C++なりの総称型プログラミングの解としてのテンプレートですが、まだここでは扱いません。ここではテンプレート実装以前のC++で利用された、プリプロセッサによる擬似的なテンプレートについて語られます。
#defineプリプロセッサディレクティブや##プリプロセッサディレクティブを利用したテンプレート風コンテナのコーディングや、そうして作られたコンテナの使用法を、メリット/デメリットを交えて解説しています。これらにもまだ不満があることから、テンプレートの組み込みへの欲求が高まったと言います。
これらはεπιさんのお得意とするところですね。Cマガなどでのεπιさんの記事を読んだことがあるなら、Smalltalk風コンテナやgenerics.hの記事に見覚えのある方も多いでしょう。その意味では目新しさはありませんが、これから始まるこゆーい世界の入り口です。ウォーミングアップもかねて復習しましょう。
次回は第二章についてお送りします。