2010-02-14

C++0x本:ライブラリは難しい

ライブラリを網羅的に解説することはできない。たとえば、vectorの全メンバーをいちいち説明することは、できない。量が膨大すぎるからだ。ではどうするか。思うに、ライブラリを使うにあたって、理解しておかなければならない、概念を説明するべきだと思う。

そもそも、コンテナとは何か、イテレーターとは何かという、概念を説明すれば、そのライブラリを使うのは、容易ではないだろうか。

私の経験では、ライブラリの全メンバーを列挙している本が、役に立ったためしはない。ただ全メンバーを列挙しているだけなら、規格書とか、コンパイラの提供するリファレンスを読めばいい。私は、個々のメンバーの解説を読んでも、STLの使い方を理解することはできなかった。

必要なのは、概念の解説だ。

概念の解説なら、冗長にならないとはいえ、やはり、すべてを解説することはできない。では、何を解説するのか。

まず、イテレーターやコンテナは必須だろう。関数オブジェクトと、それに付随するfunctionやbindの説明も必要だ。

また、ライブラリを使うにあたって、最低限しておかなければならないこと。たとえば予約語とか、std名前空間の利用だとかについても、一言書いておかなければならない。

<cstddef>や、<cstdint>は、網羅的な解説になってしまうが、これは必須だ。std::size_tとは何か、とか、int8_t, int32_tなどの整数型は、説明しておかなければならない。numeric_limitsも、できれば解説したいが、ページ数を考えると、難しい。

<algorithm>はどうだ。<algorithm>の個々の関数を解説するのは、ページ数の関係上、難しい。しかし、イテレーターを解説する以上、<algorithm>の概念は、解説しなければならない。

Move Semanticsと、それに付随する、move()/forward()は、必ず解説しなければならない。

スマートポインターも、概念を解説する必要がある。unique_ptrは、auto_ptrより使い易い。

例外安全も、概念だけは、解説しておいた方がいいだろう。

いろいろ悩んだ挙句、threadやatomic関係のライブラリは、現時点では、解説しないことにした。これには相当の批判がでるだろうが、理由がある。およそ、スレッドやconcurrencyは、数百ページ程度で説明できるものではない。それだけで一冊の本が書ける。浅く紹介だけしておくのはどうかという意見もあるだろう。しかし、

「はい、std::threadで、こんなふうに書けば、スレッドが作れますねー。はい、これでおしまい」

とか、

「std::atomicを、こんなふうに書くと、同期できます。ん? 同期って具体的に何かって? 余白が足りないので説明できませーん。あしからず」

などといった解説が、果たして何の役に立つというのか。

その他、付録として、演算子の優先順位の表と、互換機能の一覧が必要だ。

果たして、ページ内に収まるだろうか。

No comments: