インタフェイス定義としてみたときの concept の特徴
concept の定義ってまんま純粋なインタフェイス記述だけど,他の OO な言語一般におけるインタフェイス定義のあり方から見ると
- 他のインタフェイスに依存する形のデフォルト実装が書けちゃうもん!
concept EqualityComparable<T> { bool operator==(T const &, T const &); bool operator!=(T const &lhs, T const &rhs){ return !(lhs == rhs); } };
#いや,これ別にふつーに他の言語でも出来るだろ……jk.
#あれ?出来ないのもあるっけ?
- associated types も書けちゃうもん! #いや,これも出来るだろ……jk.
- 非メンバ関数に関する requirement も書けちゃうもん!
- axiom も書けちゃうもん!
あたりが特徴的かにゃー.
axiom って役に立つのん?
axiom は実際の話役に立つのかにぇ? axiom って基本的に宣言的な記述を必要とすると思うけれど,これって C++ では書きにくいし,書いたとしてもせいぜい簡単な run-time validation にしか使えないんじゃ?
unbounded / bounded
constraint に関しては, unbounded (late_check), bounded 両方可能.ブロック単位で切り替え可能.
nominal / structural
constraint の充足は nominal (explicit concept), structural (implicit concept) 両方のあり方で可能.個人的には nominal な方が好き好き大好きSSDだけれど, structural なのはサポートしとかないと多分後方互換性が総崩れになる.
structural なのと nominal なのがかち合ったとき
そういえば, concept-based overloading で structural に conform してるのと nominal に conform してるのがかち合ったときには, nominal に conform してる方が呼ばれるべきだろうって朝起きたときに考えたんだけれど,今の wording だとどうなるっぽ?曖昧 me mine になって終わり?
C++0x における constrained parameterized polymorphism の特徴
恐らく C++0x における constrained parameterized polymorphism の最大の特徴は, constraint の充足のあり方が
- クラス定義と独立,かつ
- scope (名前空間) によって切り替えられる (scoped concept map) ,かつ
- ad-hoc な adaptation の追加・置換ができる
non-intrusiveness ってそんなに重要なん? (これ聞くの多分3回目ぐらい)
constraint の充足の記述がクラス定義と独立なのは,いわゆる "non-intrusiveness" の体現だと思うけれど,これってなんでここまで重要視されてるんでしょうにぇ?
- adaptor 書くの面倒だもん!
- クラス定義変えたくないもん!
- クラス定義変えられないときがあるもん!
これを超えた議論ってあるるぅ?
scoped concept map は無かったら死ぬ
constraint の充足の記述が scope によって切り替えられるのは, constraint の充足の記述がクラス定義と独立であることの必然.これがなかったら死ぬ.
scoped concept map の機能は classboxes に似てるって言われたけれど
「ad-hoc な adaptation の追加・置換ができる」のは classboxes に似てると言われたけれど,未だによく分かりません! aspect-oriented っぽいことが出来るような出来ないような?
↑の機能が template の文脈でしか使えないのは残念
んーと, class extensions だと「見えすぎちゃうの(はぁと」なので, module 化できるようにしました?これだけ?こういうのって他の言語だとふつーにあるもんだと思ってたけど,そんなもん?ただ,これが template の文脈にしか使えないのはズバリ恐ろしく残念でしょう!
妄想1
type erasure の言語サポート (concept をパラメタとして与えるだけで,その concept に対応した (boost::any や boost::function なんかにあるような) holder/holder_base 周りの実装を言語が自動で提供してくれる機構) とか欲しいにゃー.これが入るだけで, C++ は structural subtyping 他,↑のような template におけるちょー楽しい機能が dynamic binding の文脈でもサポートされた面白くも末恐ろしい言語にーに! (こやつ,今「面白い」などと申したかっ!?)
妄想2
C++0x の (少なくとも concept 周りの) 進化は,むしろ動的言語の柔軟さを志向しているように見えなくもないんだよにぇ,個人的には.動的言語の柔軟さとgdgd感を最大限取り入れた静的型言語ここに爆誕……しねーかなー.しねーなー.
誰か偉い人
ボスケテ.