約 5,051,201 件
https://w.atwiki.jp/keyforyou/pages/20.html
Templateの一覧 Template_武将名 Template_を称した人物の一覧 Template_が諱の人物の一覧 TopPage
https://w.atwiki.jp/chocolate1120/pages/63.html
ifconfig macアドレス、ネットワークインターフェイスのIPアドレス、ネットマスクの確認 $ ifconfig -a 勝手なIPアドレスとゲートウェイアドレスの設定 # ifconfig eth0 IPアドレス netmask ネットマスク # route ←デフォルトルートのルータのIPアドレスを確認 # route del default gw デフォルトルートのルータのIPアドレス ←削除 # route add default gw 好きなIPアドレス ←付ける これらをもとに戻すなら↓ /etc/init.d/network restart
https://w.atwiki.jp/mirrnagi/pages/18.html
トップページ template - トップページ Wikiの新規ページ作成の雛形 重要項目はtemplateとする bgcolor(red){[[]]} 自身を革命家とよび、いまどき政治犯として2年投獄された 政見放送での過激な発言やその他の行動により、youtubeなどで話題になった この下に関連項目を書いたら、奴らはビビる。私もビビる。 トップページ template 新規
https://w.atwiki.jp/parepan/pages/49.html
+----------------------------------------------------------------------- | |導入と設定 | +----------------------------------------------------------------------- 1.パッケージのダウンロード http //smarty.php.net/download.php 2.smartyライブラリを解凍してphp定義ライブラリに保存 cd /tmp tar xvfz Smarty-xxxxxxxx.tar.gz phpをソースインストールしている場合 mkdir /usr/local/lib/php/Smarty mv /temp/Smarty解凍したディレクトリ/libs/* /usr/local/lib/php/Smarty/ phpをrpmでインストールしている場合 mkdir /usr/lib/php/Smarty mv /temp/Smarty解凍したディレクトリ/libs/* /usr/lib/php/Smarty/ 3.パスの追加 php.iniファイルにSmartyのパスをinclude_pathに追加 vi /usr/local/lib/php.ini include_path = ". /usr/local/lib/php /usr/local/lib/php/Smarty" ※上記一行を最終行に追加(どこでもいいみたい) 4.Apache再起動 /etc/init.d/httpd stop又は/usr/local/apache2/bin/apachectl stop /etc/init.d/httpd start又は/usr/local/apache2/bin/apachectl start ------------------------------------------------------------------------------------------ +----------------------------------------------------------------------- | |サンプルを動かしてみる | +----------------------------------------------------------------------- 稼動前提.ディレクトリ構成 documentroute -----+----index.html | +----SampleApp/----+----- index.php | +----- templates/------ index.tpl | +----- templates_c/ | +----- configs/ | +----- cache/ Smartyは、templates, templates_c, configs という三つのディレクトリを用意しなければなりません。 もし、ページの描画を高速化する built-in caching という機能を有効にした場合、cacheというディレ クトリも必要です。 [templates] テンプレートファイルを格納するディレクトリ。各テンプレートファイルの拡張子は .tpl。 [templates_c] テンプレートファイルを利用して php ファイルに展開されたファイルを格納するキャッシュ用デ ィレクトリ。Webサーバー(httpd)がファイルを作成するので、httpd.conf で設定されているWeb サーバーを起動するアカウント(User, Group)が書き込みできるオーナーとパーミッションにし なければなりません。 [configs] テンプレートなどを利用する際の設定や初期値などを登録するファイルを格納するディレクトリ。 設定ファイルが test.conf という名前の場合、テンプレートファイル内で以下のように利用します。 [cache] built-in caching という機能を有効($smarty- caching = true;)にした際に使用されるキャッシュ 用ディレクトリ。Webサーバー(httpd)がファイルを作成するので、httpd.conf で設定されているWeb サーバーを起動するアカウント(User, Group)が書き込みできるオーナーとパーミッションにしなけ ればなりません。 ※テスト環境ではdocumentroute -- /usr/loca/apache2/htdocs/です。 ※テスト環境のapacheユーザ及びグループ名は(/usr/local/apache2/conf/httpd.conより) User nobody Group #-1 1.ディレクトリ構成を作成 cd /usr/loca/apache2/htdocs/ mkdir SampleApp cd SampleApp mkdir templates/ templates_c/ configs/ cache/ chown nobody nobody templates_c cache chmod 770 templates_c cache 2.index.phpのソース ---------------------------------------------------------------------------- ここから ?php require_once( Smarty/Smarty.class.php ); // create object $smarty = new Smarty; // assign some content. $smarty- assign( name , Shinta ); $smarty- assign( url , http //www.my-domain.com/ ); // display it $smarty- display( index.tpl ); ? ---------------------------------------------------------------------------- ここまで Smarty を利用する場合、はじめに 2-1.Smarty.class.phpを読み込みます。 そして、 2-2.Smarty のインスタンスを生成することで利用可能になります。 以下が定義箇所 ----------------------------------------------------------------------------------- require_once( Smarty/Smarty.class.php ); // 2-1.Smarty.class.phpを読み込みます $smarty = new Smarty; // 2-2.Smarty のインスタンスを生成 ----------------------------------------------------------------------------------- どうしても、 Smarty.class.php が No such file or directory となる場合、 SMARTY_DIR に Smarty.class.phpのあるディレクトリを設定する必要があります。 SMARTY_DIR は、終わりに必ずスラッシュを含める必要があります。 define( SMARTY_DIR , /usr/local/lib/php/Smarty/ ); require_once(SMARTY_DIR. Smarty.class.php ); $smarty = new Smarty; 3.テンプレート・ファイル index.tpl を作成: ---------------------------------------------------------------------------- ここから html head meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" title User Info /title /head body p ユーザー情報: /p 名前:{$name} br URL a href="{$url}" {$url} /a br 日付:{$smarty.now|date_format "%Y年%m月%d日"} br /body /html ---------------------------------------------------------------------------- ここまで 4.サイトへアクセスしてみる。 Web ブラウザで、http // server-name /SampleApp/index.php へアクセスし以下の内容が表示 されればOK --------------------------------------------- ここから ユーザー情報: 名前:Shinta URL http //www.my-domain.com/ 日付:2007年12月10日 --------------------------------------------- ここまで ご注意!!! このままでは Web ブラウザからテンプレートファイルや設定ファイルが覗かれてしまいます。 そこで、テンプレートファイルや設定ファイルをドキュメントルートの外に配置しましょう。 テンプレートファイルや設定ファイルは、Smarty のライブラリがアクセスできれば良いので ドキュメントルート内に無くても動作するようになっています。 ただし、キャッシュファイルは Webサーバー(httpd) が作成するのでオーナーとパーミッション には注意してください。 設定変更例 ドキュメントルート/usr/loca/apache2/htdocs アプリケーションSampleAppの場所/usr/loca/apache2/htdocs/SampleApp/ テンプレートを置く場所/usr/loca/apache2/smarty/ SampleAppの Smarty用の場所/usr/loca/apache2/smarty/SampleApp SampleAppのテンプレートを置く場所/usr/loca/apache2/smarty/SampleApp/template SampleAppのキャッシュを置く場所/usr/loca/apache2/smarty/SampleApp/template_c SampleAppの設定ファイルを置く場所/usr/loca/apache2/smarty/SampleApp/configs SampleAppのキャッシュを置く場所/usr/loca/apache2/smarty/SampleApp/cache ファイルを以下のように配置: ---+--- htdocs/ ---+--- index.html | | | +--- SampleApp/ ---+--- index.php | +--- smarty/ ---+--- SampleApp/ ---+--- templates/ ------ index.tpl | +--- templates_c/ | +--- configs/ | +--- cache/ ロジック・ファイル index.php を修正: ?php require_once( Smarty/Smarty.class.php ); // create object $smarty = new Smarty; // template, cache, configuration files $smarty- template_dir = /usr/loca/apache2/smarty/SampleApp/templates/ ; $smarty- compile_dir = /usr/loca/apache2/smarty/SampleApp/templates_c/ ; $smarty- config_dir = /usr/loca/apache2/smarty/SampleApp/configs/ ; // $smarty- cache_dir = /usr/loca/apache2/smarty/SampleApp/cache/ ; // assign some content. $smarty- assign( name , Shinta ); $smarty- assign( url , http //www.my-domain.com/ ); // display it $smarty- display( index.tpl ); ? SASCAS
https://w.atwiki.jp/linux-memo/pages/18.html
トップページ パッケージ RPM Installer/Updater rpm yum-3.2.24-2.fc11(noarch) srpm yum-3.2.24-2.src.fc11(noarch) グループ システム ライセンス GPLv2+ 機能 YumとはRPMパッケージを自動的にダウンロードまたはアップデートするユーティリティである。他に必要なファイルを判断して自動的にダウンロードする場合もある。 Yum is a utility that can check for and automatically download and install updated RPM packages. Dependencies are obtained and downloaded automatically prompting the user as necessary. HOME Yellowdog updater modified サイズ 3.1Mb GUI gpk-application 設定ファイル /etc/yum.conf 設定記述方法は man yum.conf 両方同時に開いてみてください。man yum.conf の記述に従い[main]より下方に向かい/etc/yum.confが記述されているのが分かります。 log /var/log/yum.log 使用法 インストールされているソフトのリスト # yum list installed アップデート可能なパッケージを検索する # yum check-update パッケージ名 更新可能な全てのパッケージの更新をする # yum update 特定のアプリをインストールするには # yum install パッケージ名 削除するには # yum remove パッケージ名 パッケージグループのインストール # yum grouplist Fedora Eclipse Java Ruby X Window System LXDE OCaml XFCE # yum groupinstall パッケージグループ名 参考 Linux Lovers yumの使い方
https://w.atwiki.jp/wnt0/pages/21.html
処理の呼び出し手順(流れ)の再利用 デフォルト動作を定義したときに、サブクラスで定義し忘れないよう注意 メリット 処理の流れを把握しやすい カスタマイズポイントが明確 処理の流れの再利用ができ、コード量を減らせる http //www.dofactory.com/Patterns/PatternTemplate.aspx#_self1 をc++にした (structural example) #include iostream using namespace std; // The AbstractClass abstract classclass AbstractClass {public // The "Template method" void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); PrimitiveOperation3(); cout endl; } virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; // hook method virtual void PrimitiveOperation3() { cout "AbstractClass PrimitiveOperation3()" endl; }}; // A ConcreteClass classclass ConcreteClassA public AbstractClass {public virtual void PrimitiveOperation1() { cout "ConcreteClassA PrimitiveOperation1()" endl; } virtual void PrimitiveOperation2() { cout "ConcreteClassA PrimitiveOperation2()" endl; }}; // A ConcreteClass classclass ConcreteClassB public AbstractClass {public virtual void PrimitiveOperation1() { cout "ConcreteClassB PrimitiveOperation1()" endl; } virtual void PrimitiveOperation2() { cout "ConcreteClassB PrimitiveOperation2()" endl; } virtual void PrimitiveOperation3() { cout "ConcreteClassB PrimitiveOperation3()" endl; }}; // clientint main() { AbstractClass *aA, *aB; aA = new ConcreteClassA(); aA- TemplateMethod(); aB = new ConcreteClassB(); aB- TemplateMethod(); delete aA; delete aB; return 0;} 出力 ConcreteClassA PrimitiveOperation1() ConcreteClassA PrimitiveOperation2() AbstractClass PrimitiveOperation3() ConcreteClassB PrimitiveOperation1() ConcreteClassB PrimitiveOperation2() ConcreteClassB PrimitiveOperation3() 参考サイト デザインパターンを“喩え話”で分かり易く理解する http //www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html TECHSCORE http //www.techscore.com/tech/DesignPattern/index.html/ Programing Place http //www.geocities.jp/ky_webid/index_old.html デザインパターンの骸骨たち http //www002.upp.so-net.ne.jp/ys_oota/mdp/ デザインパターンの使い方 Template Method http //japan.internet.com/developer/20080909/26.html
https://w.atwiki.jp/norioyamamoto/pages/275.html
大規模な編集中 このページは現在編集中です。 文章推敲・情報確認中のため内容が不十分ですがしばらくお待ちください。 情報補完をしてくれる方大歓迎です。 詳しい情報 ※編集途中や編集制限のかかったページに貼りつけるお知らせコメント用のテンプレです。 例: → このページのトップ お知らせコメント用テンプレ一覧 管理者以外編集不可 荒らしなどの理由で一時的に編集制限をかけているページです。 管理者以外編集不可(長期用) 何らかの理由により長期的に編集制限をかけているページです。 大規模な編集中 現在編集中のページです。気長におまちください。 加筆修正依頼 内容が不十分なページです。加筆修正が必要です。 コメントテンプレの使い方 編集中のページや加筆修正を依頼したいページの最上部に #include_cache(Template/~) と挿入してください。 例)「Template/加筆修正依頼」を貼り付けたければ #include_cache(Template/加筆修正依頼) とページ上部に挿入してください。 ※テンプレート使用の際の注意 下記の各コメント欄で、テンプレを使用したページを必ずご報告ください。 テンプレを取り除いたときもご報告ください。 Template/管理者以外編集不可 管理者用 管理者以外一時編集不可 このページは何らかの理由により管理者権限を持つユーザ以外編集できません。 長期間編集制限が継続されているときは マームスレ にてご報告ください。 詳しい情報 使用中のページ メニューにロックをかけています。やまもと自身がwikiに書く必要がないと発言したことをのせる人がいます。 -- 名無しさん (2009-05-28 20 50 45) ↑解除されました 名前 コメント Template/管理者以外編集不可(長期用) 管理者用 管理者以外編集不可 このページは管理者権限を持つユーザ以外長期的または半永久的に編集できません。 編集すべき内容があると思った方は マームスレ にてご相談ください。 詳しい情報 使用中のページ 名前 コメント Template/大規模な編集中 全ての方が利用できます 大規模な編集中のページに貼り付けます。 編集を依頼したい場合は下記の加筆依頼の方にお願いします。 なるべく短期間で終わらせるようにしましょう! 大規模な編集中 このページは現在編集中です。 文章推敲・情報確認中のため内容が不十分ですがしばらくお待ちください。 情報補完をしてくれる方大歓迎です。 詳しい情報 使用中のページ 名前 コメント Template/加筆修正依頼 全ての方が利用できます 加筆修正を依頼したいページ用のテンプレコメントです。 内容が不十分だけど加筆修正が自分では難しいと感じたページに貼ってください。 加筆・修正を求めています このページは内容が十分ではありません。 加筆・修正の必要があります。 詳しい情報 使用中のページ 名前 コメント
https://w.atwiki.jp/drupal/pages/28.html
Content Templatesモジュール 概要 http //drupal.org/project/contemplate コンテンツタイプ毎(page,story,forum,blogなど)にテンプレートを作成することができます。 特徴 HTMLやphpを使ってコンテンツタイプ毎の見せ方をカスタマイズできます。 コンテンツタイプ毎でデザインの統一性を持たせたい場合に有効だと思います。 phpが書けるという点に注目すれば、単なるデザイン統一以外の用途にも使えそうです。 注意事項 作成したテンプレートに書き足したPHPのコードにエラーがあった場合、データベース内の該当レコードを削除するなどして、エラー状態を取り除かないとテンプレートの編集が行えなくなることがあります。 リンク Content Templates (Contemplate) | Drupal.0829.info Content Templates(Contemplate)モジュールの使い方 | Drupalサイト制作・構築の Web Go! Go!
https://w.atwiki.jp/squirrel_code/pages/22.html
続続 template × mix-in last update 2010/12/28 (Tue) なんとかならんのか. というわけで,なんとかしてみる. その4 まず, Interface について考えてみる.重要な制約は, C++ では関数テンプレートが仮想にできないという点だ.よって最後に MixExport した関数テンプレートは,どう頑張っても Interface からは呼べないことになる.やはりこの方針はまずい. で,いろいろ調べていたら using 宣言というのが目に止まった. using namespace std の using ディレクティブとは違い,メソッドやメンバを「引数」にとる.通常,基底クラスで宣言されたメソッドなりメンバなりは,派生クラスで同名のメンバやメソッドが宣言されると隠蔽される.しかし using 宣言することにより,隠蔽をはずすことができる.これだ! 書いてみる. // mixin.h #include list // for std list #include algorithm // for std find // コンテナに格納されるクラス class A { /* 省略 */ } class B { /* 省略 */ } // コンテナ機能を付加する Mix-in のインターフェイステンプレート template typename T class MI { public virtual ~MI() {} void add(T* t) = 0; void remove(T* t) = 0; }; // コンテナ機能を付加する Mix-in のテンプレート template typename T class MixIn { std list T ts; public typedef T type; MixIn() {} ~MixIn() {} void add(T* t); void remove(T* t); }; // MixIn の実装 template typename T void MixIn T add(T* t) { ts.push_back(t); } template typename T void MixIn remove(T* t); { typedef typename std list T iterator iter; iter i = std find(ts.begin(), ts.end(), t); if (i != ts.end()) ts.erase(i++); } // デフォルトの基底クラス class DummyBase { public void add(); void remove(); }; // インターフェイスのメソッド名を輸出するテンプレート template typename M, typename Base = DummyBase class IMix public Base, public M { public using Base add; using Base remove; using M add; using M remove; }; // 実装を Mix-in しながら名前を輸出するテンプレート template typename M, typename Base = DummyBase class Mix public Base, private M { public using Base add; using Base remove; void add(typename M type* t) { M add(t); } void remove(typename M type* t) { M remove(t); } }; // Mix-in されるインタフェイス class Interface public IMix MI A , IMix MI B { public virtual Interface() {} }; // Mix-in されるクラス class Container public Mix MixIn A , Mix MixIn B , Interface { public Container() {} ~Container() {} }; // mixin.cpp #include "mixin.h" ブラボー.インターフェイスも実装も再利用でき,無駄な名前の輸出もなく,加えて Interface のポインタにも MI A や MI B のポインタにも代入できる.もちろんどのポインタ経由でもデストラクタがちゃんと呼ばれる. さて,これで万事解決だろうか.IMix MI A , IMix MI B とか Mix MixIn A , Mix MixIn B , Interface とか,ちょっとややこしすぎないだろうか. こういう再帰っぽいパターンってなんとなく関数プログラミングっぽい.そういえば boost のテンプレートメタプログラミングって関数プログラミングっぽいと聞いた覚えがある.ん,何かいいのある?・・・と調べていたら, そっくりなの があった.これを改造して, Mix-in に使えないだろうか. やってみる. その5 // mixin.h #include list // for std list #include algorithm // for std find #include boost/mpl/list.hpp #include boost/mpl/iter_fold.hpp #include boost/mpl/deref.hpp #include boost/type.hpp namespace mpl = boost mpl; using mpl _1; using mpl _2; // コンテナに格納されるクラス class A { /* 省略 */ } class B { /* 省略 */ } // コンテナ機能を付加する Mix-in のインターフェイステンプレート template typename T class MI { public virtual ~MI() {} void add(T* t) = 0; void remove(T* t) = 0; }; // コンテナ機能を付加する Mix-in のテンプレート template typename T class MixIn { std list T ts; public typedef T t_type; MixIn() {} ~MixIn() {} void add(T* t); void remove(T* t); }; // MixIn の実装 template typename T void MixIn T add(T* t) { ts.push_back(t); } template typename T void MixIn remove(T* t); { typedef typename std list T iterator iter; iter i = std find(ts.begin(), ts.end(), t); if (i != ts.end()) ts.erase(i++); } // デフォルトの基底クラス class DummyBase { public void add(); void remove(); }; // 型イテレータと基底を受け取りインターフェイスを返す template typename MIter, typename Base class IMix1 public Base, public mpl deref MIter type { public typedef typename mpl deref MIter type M; using Base add; using Base remove; using M add; using M remove; }; // 型リストに含まれるインターフェイスの Mix-in template typename TList class IMix public mpl iter_fold TList, DummyBase, IMix1 _2, _1 type {}; // 型イテレータと基底を受け取り Mix-in されたクラスを返す template typename MIter, typename Base class Mix1 public Base, private mpl deref MIter type { public typedef typename mpl deref MIter type M; using Base add; using Base remove; void add(typename M t_type* t) { M add(t); } void remove(typename M t_type* t) { M remove(t); } }; // 型リストに含まれる MixIn の Mix-in template typename TList, typename Base = DummyBase class Mix public mpl iter_fold TList, Base, Mix1 _2, _1 type {}; // インターフェイス class Interface public IMix mpl list MI A , MI B { public virtual ~Interface() {} }; // Mix-in されるクラス class Container public Mix mpl list MixIn A , MixIn B , Interface { public Container() {} ~Container() {} }; // mixin.cpp #include "mixin.h" こんなのがよくコンパイラ通るもんだとちょっと感心^^.MixIn のインターフェイス,Interface クラス,MixIn クラス,Container クラスいずれも非常にシンプル. MPL すげー. ここで疑問.実装側も IMix 使えばいいんじゃね? これはたぶんできる(確認するのめんどくさい^^).こうすると Mix と IMix を 2 つ書く必要がないし, 続続続 template × mix-in で書くような汎用 Mix-in フレームワークで名前の輸出をわざわざコーディングする必要もなくなる. ただし, Container クラスが MixIn A や MixIn B の公開派生クラスとなるので, Container クラスのポインタを MixIn A や MixIn B のポインタに代入できてしまう.この状態で delete されうることを考えると, MixIn のデストラクタを virtual にしないといけない. 好みの問題だと思うが,実装は public 継承しないほうが美しいと思う.小規模なプログラムを書く程度なら, IMix の使いまわしでいいかもね. trackback 参考 C++でMix-inもどき template で Mix-in コメント コメントの投稿テスト -- (tossy_squirrel) 2010-12-29 03 35 18 名前 コメント すべてのコメントを見る 関連ページ トップページ 続続続 template × mix-in 関連ブログ #blogsearch
https://w.atwiki.jp/squirrel_code/pages/21.html
続 template × mix-in last update 2010/12/28 (Tue) しかし面倒な...なんとかならないのだろうか というわけで,なんとかしてみる. その2 その前に,少し落ち着いて考えてみる.そもそもメソッドのオーバーロードが必要となったのは,MixInA と MixInB が「ほぼ同じ」機能を持っていたからだ.MixInA と MixInB が全く異なる機能を持っているなら,そもそも同名のメソッドがあること自体,筋が悪い.同名のメソッドが無いならば,複数のクラスを Mix-in してもあまり問題はなさそうだ(実はあるんだが^^). なので,対処すべきは,複数 Mix-in されるクラスが, 全て同名のメソッド群を持ち ただし引数 or 戻り値が全て異なる 場合だろう. となれば, Mix-in されるクラスは template 化されているべきだろう.やってみる.MixInA と MixInB の実装をまとめられる以外に,何かご利益があるだろうか. // mixin.h #include list // for std list #include algorithm // for std find // コンテナに格納されるクラス class A { /* 省略 */ } class B { /* 省略 */ } // コンテナ機能を付加する Mix-in のテンプレート template typename T class MixIn { std list T ts; public MixIn() {} ~MixIn() {} void add(T* t); void remove(T* t); }; // MixIn の実装 template typename T void MixIn T add(T* t) { ts.push_back(t); } template typename T void MixIn remove(T* t); { typedef typename std list T iterator iter; iter i = std find(ts.begin(), ts.end(), t); if (i != ts.end()) ts.erase(i++); } // Mix-in されるクラス class Container private MixIn A , private MixIn B { public Container() MixIn A (), MixIn B () {} ~Container() {} template typename T void add(T* t) { MixIn T add(t); } template typename T void remove(T* t) { MixIn T remove(t); } }; // mixin.cpp #include "mixin.h" テンプレート化されたので,list iterator の typedef 時に typename が必要になることに注意. テンプレート化にともない, Container クラス内での名前の輸出をテンプレート関数にすることが可能となる.これで複数の Mix-in で提供されるメソッドの名前を全て輸出しなくてもよくなる. とはいえ,やっぱり名前の輸出が必要なことに代わりはない.なんとかならないだろうか. その3 ここで呼吸をととのえて,さらに考えてみる.Container クラス内での名前の輸出は,当然ながら Container クラスの public スコープへの干渉操作となる.これを public 継承で実現してはならないのは「その1」で見た通り.これをなんとかするには,続続 pImpl × 継承 でやったように,テンプレートを用いる. ところが,続続 pImpl × 継承 で使った名前の輸出テンプレートは,各 Mix-in を private/protected 継承している必要がある.よって,MixIn A と MixIn B を同時に Mix-in するためには,この2つを Mix-in するための専用のテンプレートが必要だ.Mix-in の種類が増えてくると,様々な Mix-in の組み合わせ全てに専用のテンプレートを用意しなくてはならない. そこでうーんと考えた.Mix-in の組み合わせを private 継承する操作を,Mix-in 1つの protected 継承と public 継承に置き換えられないだろうか.書いてみる. // mixin.h #include list // for std list #include algorithm // for std find // コンテナに格納されるクラス class A { /* 省略 */ } class B { /* 省略 */ } // コンテナ機能を付加する Mix-in のテンプレート template typename T class MixIn { std list T ts; public MixIn() {} ~MixIn() {} void add(T* t); void remove(T* t); }; // MixIn の実装 template typename T void MixIn T add(T* t) { ts.push_back(t); } template typename T void MixIn remove(T* t); { typedef typename std list T iterator iter; iter i = std find(ts.begin(), ts.end(), t); if (i != ts.end()) ts.erase(i++); } // デフォルトの基底クラス class DummyBase {}; // 1つづつ Mix-in するテンプレート template typename M, typename Base = DummyBase class Mix public Base, protected M {}; // Mix-in しつつ名前の輸出もするテンプレート template typename M, typename Base = DummyBase clas MixExport public Base, protected M { public template typename T void add(T* t) { MixIn T add(t); } void remove(T* t) { MixIn T remove(t); } }; // Mix-in されるクラス class Container public MixExport MixIn A , Mix MixIn B { public Container() {} ~Container() {} }; // mixin.cpp #include "mixin.h" MixIn C も Mix-in する場合は MixExport MixIn A , Mix MixIn B , Mix MixIn C を public 継承すればよい.あるいは Container がクラス Interface を public 継承している場合, MixExport MixIn a , Mix MixIn B , Interface のようになる.Interface がある場合でのデストラクタまわりがややこしかったが, Mix テンプレートや MixExport テンプレートに仮想デストラクタを書かずとも,Container クラスが Interface クラスのポインタ経由で delete されたとしてもちゃんと Container のデストラクタが呼ばれているようだ @ gcc. ここで注意点として,Interface クラスはその名の通り実装を持ってはならない.いや,持ってもいいのだが,持っていたとしても Interface クラスのデフォルトコンストラクタ以外のコンストラクタを呼ぶことはできない.ただこの制限は,public 継承で実装を再利用しないという方針を考えると問題ないし, 続続 pImpl × 継承 のようなやり方も使える. もう一つは,MixIn テンプレートを実体化したクラスもデフォルトコンストラクタ以外を呼べない点だ.MixIn A や MixIn B は実装だから,この制限は問題だ.・・・のだが,うまく回避する方法が思いつかない.あまり美しくないが,コンストラクタ以外の初期化関数を定義して Container クラスのコンストラクタで呼んでやるか,素直に Container クラス内で名前の輸出をするしかなさそうだ. 追記 テンプレート引数に初期値の情報を含んだクラスを入れてやるという方法がありますね. さて,これで十分だろうか.いやいや,問題は残っている.Java の interface はそのまま型として使える.つまり Interface インターフェイスを implement したクラスのインスタンスは, Interface 型の変数に放り込める. 上記の C++ Mix-in ではこれは不可能だ.Container クラスは Mix MixIn B として扱えるが,add や remove は呼べない.MixExport MixIn B なら add B と remove B が輸出されるが,これに Container クラスのインスタンスを入れることはできない. というかそもそも,Container が Interface を継承しているとき,今のままでは Interface のポインタ経由で add とか remove を呼び出せない.(なにせ Interface を書いてないからね)で,どう書けばいいんじゃい. なんとかならないだろうか(えー,もういいじゃん^^). trackback 参考 C++でMix-inもどき template で Mix-in コメント コメントの投稿テスト -- (tossy_squirrel) 2010-12-29 03 35 18 名前 コメント すべてのコメントを見る 関連ページ トップページ 続続 template × mix-in 関連ブログ #blogsearch