人類の医学に期待してC++標準にMOPが入るのを待ちたい
もう疲れたよパトラッシュ.多重継承・friend・テンプレートが混ざるともう何が何やら.例えば架空のGUI クラス・ライブラリ Qtk を考え,その中のクラスは全て class QtkWidget
なるインタフェイス(抽象クラス)から派生するものとする.さらにスマートポインタの利用を強制するために全ての子クラスにおいてctor & dtorをprotectedにして,代わりにスマートポインタ化するラッパを定義,さらに削除子をfriend宣言したい.
以下,普通にやると超めんどいヘッダの雰囲気だけ掴めるような例
class QtkWidget { friend void boost::checked_delete(QtkWidget *); public: typedef boost::shared_ptr<QtkWidget> Ptr; protected: QtkWidget(); ~QtkWidget() = 0; }; // pure virtual dtor ... これは今は問題ではない inline QtkWidget::~QtkWidget() { } class QtkButton : public QtkWidget { friend void boost::checked_delete(QtkButton *); public: typedef boost::shared_ptr<QtkButton> Ptr; protected: QtkButton(); ~QtkButton(); public: Ptr New() { return Ptr(new QtkButton); } }; class QtkLabel : public QtkWidget { ...
実質の処理を司るメンバやメンバ変数を一つも宣言してないのにこのめんどさ((typedef ... this_type
とかやってもいいが,気休めにしかならんかったよ.)).これを全ての子クラスに手動で強制するなんてやってられない... 私はやったけどな.やったにはやったが精神力の疲弊が著しかったので,どうにか言語の機能で自動的に実現したいと思ったが,C++では無理の様子.
CRTP (Curiously Recurring Template Pattern) でMixin的なことを実現するイディオムがあるが,CRTPは本当の "Mixin" (中に混ぜ込む)と異なり,対象クラスと「Mixin風テンプレート」は子・親の関係にくっきり分離したままだ.それが本来の意図の継承関係とかち合うのが困る.例えば上記のような QtkWidget
の子クラス QtkButton
を考え,両者に「Mixin(と言いつつMixされてない)」を適用すると,
template<class Derived> class SmartNewMixin { public: typedef boost::shared_ptr<Derived> Ptr; Ptr New() { return Ptr(new Derived); } template<typename T1> Ptr New(const T1 &x1) { return Ptr(new Derived(x1)); } template<typename T1, typename T2> Ptr New(const T1 &x1, const T2 &x2) { return Ptr(new Derived(x1, x2)); } template<typename T1, typename T2, typename T3> // こんだけあれば十分だろ... Ptr New(const T1 &x1, const T2 &x2, const T3 &x3) { return Ptr(new Derived(x1, x2, x3)); } }; class QtkButton : public QtkWidget, public SmartNewMixin<QtkButton> { friend void boost::checked_delete(QtkButton *); protected: QtkButton(); ~QtkButton(); };
このとき QtkButton
内部で QtkWidget::Ptr
と SmartNewMixin
は曖昧な関係になり破綻する.それとfriend宣言は継承で伝播しないので,そのめんどさはCRTP(を含む,継承ベースのハック)では改善できない.
あぁもう,疲れて結論に至らないよ.言いたいのは,千葉先生のOpenC++はなんで放置されてんの? ってことだ.テンプレートなどコンテナに限って使えばよいものであって,メタプログラミングに応用するような愚かしい労力の無駄は早々に切り上げるべき.あと何年(何十年?)待てば人々の目はMOPに向かうんだ? (願わくば途中でゲットリッチしてC++プログラミングのような下賎の技は雇用している従業員に任せられる身分にならんことを...)