ある既存のクラスに対して,翻訳単位あるいは lexical scope 単位で ad hoc に non-intrusive な mixi-in らしきもの (インタフェースとなる free-standing 関数定義の追加) ができたら良いなぁと思った今日この頃. C++ だとほぼ事実上不可能な感じ.不可能ということはこれを導入すると技術的もしくは安全性の観点からまずいんだろう.あんまり良く考えてないから知らんけど.
// 俺が触れないクラス定義 // 入力ストリーム演算子 (operator>>)・出力ストリーム演算子 (operator<<) が定義されていないとする. class C;
// とある実装ファイル hoge.cpp #include <boost/lexical_cast.hpp> void hoge() { C c; // この位置で c に対して lexical_cast を使いたい. // lexical_cast は operator>>, operator<< を使うので, // この位置で C に対する operator>>, operator<< の定義を // 「この実装ファイル (をコンパイルする翻訳単位) の外に漏らさずに」追加したい. // 定義を外に漏らしたくない理由は,他の場所で (自分以外の第3者が) 同じ要求を行うかも知れないから. }
これが事実上無理ってゆ〜. adaptor 書くのが一番安直な方法で,かつ多くの場合それで大体の要求が満たせるのだけれど, adaptor による解決は C++ の場合特にオブジェクトの寿命管理周りでごにょごにょごにょ.あと基本的に adaptor は書くのがまんどくせー.
move semantics があれば, adaptor にいったんオブジェクトを move で移動して (捨てて),目的の操作を adaptor でやってから,もいっかい move で adaptor からオブジェクトを取り出す (拾う) とかってできるよにゃー.ただし,このやり方が良いかどうかはめがっさにょろにょろ.