http://tinyurl.com/8wsoz
(以下の各引用はちゃんと元のポストを読んで,その文脈を把握した上で読んでくださるよう強くお願いします)
If there were some abstract type from
which int, char, etc, were derived then templates would be unnecessary.
In other words, templates only exist because C++ isn't fully OO.
これはさすがにあかんやろと思っていたら案の定,激しく反駁されてた.しかし,(主張の良し悪しはともかくとして)こういうラディカルなポストの方が往々にしてスレッドが面白くなったりするからあなどれない.
これを型安全でない covariant argument types と表現するというか,型安全に引数を共変にできるのが OO との差異だという表現は初めて見た.ちょっと新鮮. しかし,前からずっとずっと疑問に思っているのだけれど, 「OO でできて (C++ のテンプレート,もしくは OO とテンプレートの協調による) 汎用プログラミングでできないことって何だろう?」 まぁ,ここで言ってる「OO でできること」っていうものが漫然としすぎているからどう答えようもない疑問なのかな.
Yes, there is. Covariant argument types (the kind you need in order
to do int + int and complex + complex with the same '+' operation --
or swap, for that matter) can't be implemented using traditional OO
without compromising static type safety. Among other things.
静的多相と動的多相に各々固有の強みがあるのは当たり前.その上でもう1つ上位の議論が欲しい.両方のトレードオフの取捨選択,さらに言うと両者のシームレスな結合(その例として出したのが昨日の Type Erasure)という観点から C++ を説明した書籍なんて出ようものなら Amazon で予約してでも買いますからっ!!っていうか,読む用・保存用・布教用の最低3冊は買いますからっ!!
It's not that they're bad; static and dynamic polymorphism have
different roles and different strengths.
ふぉあああぁぁぁーーー!!!! 以前どっかで「コンセプトに基づくオーバーロードなんてやっぱ時期尚早かなぁ」とか愚痴った気がするけど,プロトタイプとは言えすでに実装まであるんじゃねーーーかよおおおおぉぉぉぉ!!!! #っていうか今日の朝布団から起きたときにふと思ったんだけれど,右辺値参照にしろコンセプトにしろ,C++ のコード生成プロプロセッサ(translator)作ってそれで提案されている各種言語拡張を実装するっていう手法は案外お手軽かもしれない.っていうか C++ だからこそそういう手法がお手軽になるのだけれども.ただ,parser の実装だけは超面倒くさいな.自前の実装あるにはあるけれど.右辺値参照,コンセプト,FOREACH,typeof くらいならある程度現在の規格内で半機械的にエミュレートできるから,semantics にあんまり触れずに構文変換だけで行けそうな気がするんだけどなー.甘いかなー.甘いだろーなー.っていうか甘い・甘くない以前にこれを許すと際限のないオレオレ構文糖の蔓延に通じるのだけれど,標準に提案されている素晴らしいものなんだっ!!て言い訳になりませんかね?なりませんね.ショボーン.しかし,少なくとも右辺値参照なんかは実際に実装を見せないと,なぜ標準ライブラリ総書き換えになるほどのインパクトを持っているのかなかなか理解してもらえないよな〜.
I hope you're aware that the competing concepts proposal supports
that, and it has been implemented:
http://www.osl.iu.edu/~dgregor/ConceptGCC/
You can download that compiler and use it today.
ちょっとラディカルなこと言っちゃうよ?言っちゃうからね?っていうか思ったことフィルタせずに書いてるだけだから無視してね. (以下で「テンプレート」と書いているのは,その型パラメータに代入されると想定される型の集合が有限でないとき,つまりテンプレートの書き手が型パラメータに代入される型を全て列挙できない場合で,コードジェネレータ(型安全なマクロ)を超えた,汎用プログラミングの意味合いを真に発揮する文脈での「テンプレート」に限っている) ラディカル始め. 「テンプレートあるところにコンセプトあり」 もしくは対偶. 「コンセプト無きところにテンプレート無し」 もうこれぐらい言って欲しい.テンプレート(ライブラリ)を使うときにコンセプトという概念(変な表現だけど)を理解しなければならないとは言わない(しかしできれば知っていて欲しい)けれども,少なくともコンセプトという概念を知らずにテンプレート(ライブラリ)を書くなぐらいは言ってしまいそうになるときが何度もある. しかし,英語ですら "concept" をまともに取り扱った書籍や解説もないというこの現状でそれを要求するのはかなり厳しい.ほぼ唯一と思われる,一読しただけでは意味不明なこのページこそ,どんな STL や Boost の解説ページ・書籍よりもまず先に読んで,(最初に読んだときには理解できなくても良いので)このページに書いてあることが STL や Boost の根幹だということを常に心の隅に留めておいて欲しいと思う.それだけで少しは現状が改善される気がする. 多分,この状況の根源はコンセプトという概念がきちんと確立される以前に,先に STL という強力なライブラリの実装が世に出てきてしまったことじゃないかと思う.Alex Stepanov 自身,STL の実装が出てきてから数年経ってようやく "concept" という言葉を1つの terminology として使い出しているように見える.けれど,その時ですらまだ "concept" という用語は今あるような "valid expression" や "associated types" といった用語で説明されるようなものではなく,漫然と理解される代物であったように見える.その当時の変遷が分かる資料がなかなか無いので想像する部分が多いのだけれど. しかし最後の1文が泣きそうなぐらい嬉しい.こういった汎用プログラミングの根幹をまともに扱った書籍が出るらしい上に,David Abrahams 氏をして "some experts" と言わしめる著者陣なようだから,テンプレートライブラリの利用者・実装者双方に普遍の,固有のライブラリの説明に始終するだけではない,真の意味で汎用プログラミングの概念とテンプレートライブラリ設計のあり方を導入する,「STL, Boost の 各種解説も "Modern C++ Design" も,まずはどうでも良いからとりあえずこれ読んで」といえる1冊になると,とんでもなく期待しているんだけれど. ラディカル終わり.結局,ラディカルに徹しきれずにトーンダウンしてしまった.ぬーん.
You're right. And very few people, even among those who know the STL,
seem to understand concepts, despite their fundamental nature. As far
as I can tell, there are no books on the discipline of generic
programming (I have great respect for Austern, but his book is mostly
about the STL and only marginally about GP). Fortunately I think I
know some experts who are working on one :).