1 名前:デフォルトの名無しさん [2008/02/16(土) 12:45:02 ] ・ここはC++のテンプレートメタプログラミング専用スレです。 ・なかったので立てました。 ・前にもあったような気がするけど気にしない。 ・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。 仲良く使ってね。
154 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:16:13 ] >>153 これは良いですね!頂きます。 使ってみて、若干罠というか、引数なし版はプロトタイプ宣言と勘違いされるため R<r> a(r()); //error こうする必要があるんですね(もっと良いやり方があるのかは知らないですが・・) R<r> b(*(new r())); これを参考に、少し書き換えて見ました struct b {virtual int rdm(){return 0;}}; struct r:b {int rdm(){return rand()%128;}}; struct rs:b{int rdm(){return rand()%7+60;}}; struct rc:b{ int val; rc(int n) : val(n){} int rdm(){int tmp=rand()%7;if(tmp%val==0){return tmp;}else{return rdm();}}}; template <class T=b > struct Q { T* t; Q( T* t_) : t(t_){} int rdm() { return t->rdm();} }; Q<> a(new rc(3)); Q<> b(new r());
155 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:55:23 ] >>154 > R<r> a(r()); //error R<r> a((r())); でいけるよ
156 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:15:23 ] ほんとだ、こっちのが短くていいですね。
157 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:27:24 ] struct b::rdm() を virtual にするなら template にする意味は無いと思うのだけれども・・・。 struct Q { // non template version b * t; Q( b * const t_) : t( t_ ? t_ : new b ){} ~Q() { /* Do you want to delete t ? */ int rdm() { return t->rdm();} }; でいいでしょ。 ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
158 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 16:08:53 ] 単に左辺を書かなくても良くなるぐらいの気持ちで書き直したんですが そもそもtenmplate無くても動きますね・・難しいなぁ ある意味、template使わなくてもポリシーベースのプログラミングが出来るわけですね あえてtemplateを使う利点が整理できてないので考えてみます。 >ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。 シンプルながら、これは説得力ありますね
159 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 16:43:24 ] >>155-156 R<r> a;でいいじゃない。
160 名前:157 mailto:sage [2009/01/24(土) 17:11:30 ] >>158 > あえてtemplateを使う利点が整理できてないので考えてみます。 157 では、t->rdm() は、コンパイラによって必ず仮想関数呼び出しコードが出力される。 テンプレートバージョンでは、定数を返す場合などには、もしかしたらコードは全く無くなるかもしれない。 153 程度で大げさな、と思うかもしれないが、これもメタプログラミングだ。 実行時に通過するコードではなく、コンパイルで出力されるコードを、引数で変えることが出来るから。 C のプリプロセッサマクロでも出来るけど、C++ template は型チェックとそこから派生する特殊化された型の選択が強み。 > シンプルながら、これは説得力ありますね 157 の Q のデストラクタを見てみて。 あと、メモリ消費量が減るかも。 ところで、154 の記法の問題は、cl, bcc, gcc で試したけど、 R<r> a( (r)r() ); が一番互換性が高いようだ。 もちろん 159 でいいんだけどw 引数を明示したいならね。
161 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:32:50 ] > R<r> a( (r)r() ); たまたま‘r’という短い名前だからそれでいいかもしれんが、 名前が長かったり、さらにネストしたテンプレートクラスだったりすると 書くのも面倒だよ。 他にも R<r> a = R<r>(r()); とか考えられるけど、やっぱり R<r> a((r())); が楽だと思うけどね。
162 名前:デフォルトの名無しさん mailto:age [2009/02/14(土) 00:35:29 BE:1969877186-2BP(0)] age
163 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 22:20:49 ] テンプレートの引数にテンプレート渡せるのか〜知らなかった。 これで大分やれることが広がったぜ。ウヒヒ ていうか、テンプレートの完全な仕様ってどこに行けばみれるの?
164 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 22:27:47 ] >>163 ちょうどこっちでその話があったところ。 pc11.2ch.net/test/read.cgi/tech/1234420483/758-767