Entry

連休中に読んだ本 - 『C++テンプレートテクニック』

2009年05月09日

先日買った旨少し紹介したんですけど,しっかり全部読みました。テンプレートは奥が深い。

C++テンプレートテクニック
επιστημη 高橋 晶
ソフトバンククリエイティブ
売り上げランキング: 843

C++ が C と大きく異なる点のひとつに,テンプレート機能ってのがあります。念のために説明しておくと,テンプレートってのは,一般的な型を指定して一般的な関数なりクラスなりを作れる機能です。

例えば,ふたつの引数のうちで大きな方を返す nm::max() を考えてみます。C だと,引数の型に応じて複数関数を用意しなくちゃいけませんけど,テンプレートで書くとひとつだけで済みます。こんな感じで。

#include <iostream>

namespace nm {
    template<class T>
    T max(const T a, const T b) {
        return (a < b) ? b : a;
    }
}

int
main(int argc, char* argv[]) {
    std::cout << nm::max(5, 2) << std::endl;
    std::cout << nm::max(10.2, 15.7) << std::endl;
    std::cout << nm::max(std::string("abc"), std::string("ab")) << std::endl;
    return 0;
}

std::string の例は効率が良くないけど,ここは例ということで……。ともかく,これを実行すると,こんな結果になります。

% sample
5
15.7
abc

テンプレートの定義時は T という一時的な型を使うんですけれど,コンパイル時に各型に応じた nm::max() 関数を内部で作ってくれるというわけです。Java にも似たような書き方をする機能に,ジェネリックスってのがあるけれど,そんなもんよりよっぽど強力な機能です。

で,このテンプレート機能なんですけれど,使い方によって,ものすごく使い出のいいクラスを定義できたりします。例えば,boost::any のような汎用型クラスを作れたりとか,メタプログラミング的な使い方ができたりとか。C 言語でも,マクロを使ったジェネリックプログラミング(Generic Programming; 汎用プログラミング)が使われていたけれど,C++ のそれはもっと強力です。

一方で,テンプレート機能は,突き詰めるほどややこしい話になってきます。ほとんど裏技に近い。本書は,そうした裏技のうちで,よく使われる有名なテンプレートテクニックを集めた書籍です。先日,このサイトでも boost::any を読んだけれども(参照:qune: プログラミングメモ - boost::any を読む),ここで話していることをもっと体系的に,そして丁寧に解説しています。boost::any についても,本書では割と大きく扱っていて Type Erasure というテクを使ってるということを知りました。知らんかった。

C++ には,演算子を多重定義できたり,関数をオーバーロードできたりと,かなり柔軟で強力な機能が備わっています。特に,ライブラリを開発するときにこれらの機能は有効で,使いこなすほど使い勝手のいいライブラリを作ることができます。テンプレートも,C の融通の利かない不便さを補う機能だといっていいと思います。また本書は,次期 C++ の標準である C++0x の導入本としても有効です。新し物好きはきっと食いつくはず。

他方,ライブラリ開発のような場面から少し離れた,一般的なアプリケーション・エンジニアリングの観点からすると,個人的に,テンプレートはデバッグが難しいと考えていたりします。テンプレートはコンパイル時に解釈・翻訳されるわけですけど,内部形式を直接覗くことができないし,挙動を直接追うことも難しいからです。あたしゃ以前から疑問に思ってるんですけど,テンプレートを使ったコードのデバッグって,具体的にはどうやってるんでしょ。ここら辺の記述があると,もっと嬉しかったかも。

テンプレート機能は,使う側の「節操」が要求されると思っていて,ゴリゴリ使いまくるのも(感覚的に)なんだかな,とか思っていたりしています。本書で一通りテクを知ったら,使いどころも身に付けたいところ……と,えらそうにごにょごにょ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN