ソフトウェア技術書温故知新、第二回は2001年に邦訳が刊行されたアンドレイ アレキサンドレスク『Modern C++ Design』(ピアソンエデュケーション)。
かつてオブジェクト指向プログラミング言語としてC++が圧倒的な存在感を放っていた時期、多くの人に重宝された書籍が人類には早すぎたC++をなんとか安全に取りあつかうための手引書であることは論を俟ちません。もっとも代表的なのは『Effective C++』(リンク先は最新の第3版)でしょうが、他にも『Exceptional C++』『現実的なC++プログラミング』などいろいろありました。余談ですがCRCカードを用いた設計技法をはじめて知ったのはこの本で、どういうわけかカードを大量に入手する機会があったので実務で実践してみたこともあります。のちにCマガジンがさも日本ではじめて紹介するみたいな顔で特集を組んで、(あらためて)あきれたりしたものでした。
閑話休題。一方で、数は少ないもののC++の可能性の追求と普及を図る書籍も少数ながら刊行されてきました。その中でも邦訳当時突出していたのがこの本。テンプレート機能を用いて処理を実行時ではなくコンパイル時に解決してしまう技法が基礎から応用まで山盛り詰まってます。着想自体は著者のオリジナルではないようですが、その方法を徹底的に突き詰めできることは可能なかぎり実行前に解決し同時にアサーションや型安全検証まで実現していく手際は初読当時唖然とするばかりでした。あっけにとられるとはまさにこのこと。
もっともこれを役に立てることはできるのか、と疑問に思ったこともまた事実。STLさえまだ充分に普及していない、仕様が直感的でないテンプレートをあえて利用する必要のない状況で、しかもコンパイラのテンプレート関連処理はまだまだバギー(だったのですよ、2001年当時は)、とくればあえて挑戦するだけのインセンティブはありませんでした。チーム開発であればなおさらです。
幸い(?)私は実践する機会に恵まれました。Windows用のライブラリをPDAのPalmで動作させる技術検証を一人で行うことになったのです。当時のPamの開発言語はかろうじてC++ベースではあったものの(統合開発環境はCodeWarriorでした)実行時型情報(RTTI)は未サポートで仮想関数は使えません(いまから考えると信じられないかもしれませんが、当時はめずらしくありませんでした。組み込み用にEmbedded C++という規格が別途策定されたくらいです)。Windowsではさすがにそんなことはなかったので仮想関数は普通に使われており、そのままでは実行どころかコンパイルさえ成功しません。
当初は途方にくれましたが、仮想関数呼びだしを本書で紹介されているポリシークラスの考えを元に組み替えることで多態を実現、Windows版と同等の機能の実現に無事成功したのでした。この技術検証の結果は残念ながら日の目を見ることはありませんでしたが……
その後C++を用いた開発からは遠ざかったので本書がどれくらい実践の現場に影響を与えたのかはわかりません。しかしその威力はBoost C++やANSI C++の規格改定などで遺憾なく発揮されているものと思われます。実用的に利用できる言語の選択肢が増えた現在、個人的には積極的にC++を選択しようとは思いませんが、過去の資産なども考えあわせるとC++は今後も長く使われ続けることでしょう。もしかしたらいつまでも人類には早すぎた言語としてかもしれませんが。
なお著者のアンドレイ アレキサンドレスク氏はその後D言語 2.0の開発に参画、解説書も執筆しています(『プログラミング言語D』)。邦訳でその名をたしかめたときは使う見込みもないのについ購入、他のプログラミング言語の批判的検討におおいに役立ちました……D言語は一生使うことはないと思いますけど。いまならRust使いたいなあ、契約による設計も使えるし(D言語と違って標準仕様ではなくライブラリでの実現ですが)。