http://www.kmonos.net/wlog/85.html#_0905080505
う〜ん, structural かどうかではなくて non-intrusive かどうかっていう軸の方が重要だと思うんですけれどどうなんでしょうかねー.
non-intrusive という言葉を明快に定義してくれている書籍なりサイトなりが少なくてアレなんですが,オレオレな理解で行くと, non-intrusive とは,あるデータ型 T が何らかの制約 (これこれこういうインタフェイスを持ってないといけないよ,という決まり) を満足しているかどうか,に関する記述が T の定義と独立に記述することができる,あるいはもはや制約の充足に関する記述自体不要,ということだと理解しています.
歴史的な流れでいうと STL の存在が大きいのはこれは k.inaba さんの指摘どおりだと自分も思っていて,たとえば STL のアルゴリズムはポインタ型もイテレータとして扱えなければならなかった.ところが, STL において機能するように,ポインタ型という型の定義に侵入的な変更 (たとえばポインタ型が新たに何か基底クラスを継承するようにする,といった変更) を加えることは許されなかった.何せ組み込み型だし. STL ではどうしたかというと,「operator* が定義されていて,その意味は〜〜で,計算量は〜〜で」「operator++ が定義されていて,その意味が〜〜で,計算量は〜〜で」以下云々……という制約を満たす型は全部イテレータであるとして,ポインタ型も std::vector
あるコンポーネント C が, C の存在をまったくもって想定していなかった別のコンポーネント C' に対しても, C' に対して侵入的な変更を加えることなく機能する.具体的な話に置き換えると, STL というコンポーネントの登場をまったくもって想定していなかった (C 由来の) ポインタ型が,その型の定義にまったく侵入的な改変を被ることなく, STL というコンポーネントにおいて普通に機能する.こういう特徴を,少なくとも C++ のコミュニティでは極めて重要視しているように思える.
しかし, structual polymorphism はこういう特徴を持つための十分条件に過ぎないんじゃないだろうか.
上記のように「STL がポインタ型も汎用に扱える」手段として,果たして structual polymorphism という選択だけしかなかったのか?というと自分の見解では明らかに NO であって,たとえば,
template<typename T> RandomAccessIterator<T*>;
という記述で (もちろんこの記述は C++03 の記述ではありませんが),あらゆるポインタ型が RandomAccessIterator という制約を満足していることを明示的に表明できる,というあり方は多分ありえた.この書き方は, (nominal/structual という言葉の厳密な定義を知らないので間違っているかも知れませんが) nominal である,というべきでしょう.
structual ならば制約の充足の可否がインタフェイス (シグネチャ) の有無によって暗黙に決定されるため,この意味で non-intrusive (そもそも制約の充足を明記する必要すらない) なのですが, structual polymorphism という選択以外に,たとえば上記のように nominal かつ non-intrusive という記述ができる,という選択もあって良いはず.ただ,歴史的な背景,技術的未成熟,言語機能,言語機能の実装その他もろもろの関係から, STL が登場した当時においては structual polymorphism という唯一の選択を持って non-intrusiveness を達成するしかなかった,というのが自分の理解.
structual か, nominal (かつ non-intrusive) かは,non-intrusiveness を達成するという目的においては,最終的には,どちらが良い/悪いとかを決定できる類のものではないのではないかな,と.単に non-intrusiveness を達成するための選択肢として C++ プログラマの道具箱にこの2つが入っている,そういう類のものかと思います.実際, nominal な記述によるインタフェイス記述の階層化は,型が表す概念の間に明快な階層を見出せるならば,上手く概念上の構造ととインタフェイス記述の構造が合致し,これは subtyping の特徴を長所として上手く引き出せると考えられます.従って,この特徴を温存しながら non-intrusive な形で書きたいというのは,少なくとも選択肢としてはあってしかるべきじゃないかにゃーと,そう思うんですが眠い.