世間でのC++のテンプレートに対するバッシングと言い訳

テンプレートを使うとコードが読みにくい

多分vector<int>を読みにくいと言う人はいないと思う。むしろ、テンプレートの存在を知っているならば、「int用のvectorだ」と素直に理解できるぐらい簡単。読みにくいのは、例えば(次のコードは例なので、意味は分からなくてもいいし、厳密でもない)、

template<typename F, typename T>
typename enable_if<
    is_tuple<T>,
    typename apply_<F, T>::type>::type
apply(F f, T args) {
    ...
}

のような、テンプレートの定義・実装側の話ではないだろうか。この例は一応、関数オブジェクトとその関数オブジェクトを適用する引数のタプルを受けとって、適用した結果を返す関数を定義している(というような感じの)例だが、使う側の記述は、apply(functor, make_tuple(1, 'c', "string")); と、何も難しい記述は必要ない。ということは、自分でテンプレートを定義・実装しなければ特に難しくはない。その理屈でいけば、STLやBoostを「使う」分にはさほど難しくはないはずである。

テンプレートを使うとパフォーマンスが落ちる

古典的な、プリプロセッサによるマクロを使ってテンプレートに似たようなことをした場合を考える。#define MAX(a, b) ((a) > (b) ? (a) : (b)) C++においてこのコードは、aやbの型の定義、operator >の実装によってはとても時間のかかる処理かもしれない。
テンプレートのパフォーマンスも同じで、テンプレートパラメータとテンプレートの実装によってはとてもパフォーマンスの悪いコードができてしまったり、そもそもコンパイルできない可能性がある。そういったことを避けるために、テンプレートを定義・実装する際には、普通、そのテンプレートのパラメータが満たすべき要件を記しておくものである。STLもBoostも、そういった要件に関する記述はドキュメントとして存在する。

テンプレートを使うとコンパイルエラーが読みにくい

これは迷信じゃない、本当。どうしようもない。コツを覚えていただくしか。
あとまぁだいぶ先だけど、C++0xではConceptなる機能が存在するので、それがあればきっと分かりやすいエラーを出してくれるはず!

まとめ

コピペしたら負けかなと思っている。