[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 05/09 14:21 / Filesize : 39 KB / Number-of Response : 165
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++/TemplateMetaProgramming



1 名前:デフォルトの名無しさん [2008/02/16(土) 12:45:02 ]
・ここはC++のテンプレートメタプログラミング専用スレです。
・なかったので立てました。
・前にもあったような気がするけど気にしない。
・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。

仲良く使ってね。

142 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 02:40:29 ]
とりあえず検索用語だけ
template-template-parameters

143 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 23:27:12 ]
class Hoge {
template <int X> void Fuga() {...}
};

テンプレート引数Xの値を、静的な値として集めることってできますか?
具体的には、呼び出されたFugaのうち、最も大きいXを取得して、別のクラステンプレートに渡すとか。

144 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 01:21:18 ]
>>143
パッとみて無理っぽいうえにコンパイル単位をまたぐ場合を考えるとさらに無理っぽい。

145 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 20:35:00 ]
(´;ω;`)

146 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 04:36:26 ]
>>142
横だけど、meta templateでググっても見つからなく困っていたので助かった。
そういう用語だったのか…

147 名前:99 [2009/01/12(月) 20:40:07 ]
まいど。

どうしても欲しくなったのでマルチメソッドを実装したんだけど、もっと効率的になる改善点てあります?
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?rev=1.1&view=markup
(解説)ttp://fiercewinds.net/siki/pub/2009/01/12_191240/
解説がクソなのは置いといて下さい。

もっと良い実装があればそれも紹介して欲しいです。

個人的には
・いちいち登録しなきゃいけないのが面倒。
・トランポリン関数を保持する配列が疎になるのでメモリ効率が悪そう……
というところが気になるところです。



148 名前:99 mailto:sage [2009/01/13(火) 00:44:59 ]
ちょっとだけ >147を修正。
登録をヘルパークラスに任せることにしました。少しはスマートに見えるけど、受け入れる型を
全部登録しなきゃいけないのは変わらず……

色々と考えてみたけど、どうやっても仮想関数に型情報は渡せなさそうね……。


149 名前:99 mailto:sage [2009/01/13(火) 01:15:20 ]
リンク間違えてたので修正します。
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?view=markup

150 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 20:24:39 ]
ポリシーによるプログラミングで質問です。
適当な乱数を発生させるTraitsクラスを何個か定義します。
 struct r {int rdm(){return rand()%128;}};
 struct rs{int rdm(){return rand()%7+60;}};
そんで、Traitsを使うクラスがこれ。ここまでは順調です。
 template <class T=r> class R{int rdm(){return T.rdm();}};

この後、rdm関数が引数を持つようなTraitsを加えようとすると型があわないため困りました。
しかし、こういうケースは良くあるのではないかと思います。
 struct rc{int rdm(int n){return n*(rand()%128);}

少し悩んでこんな解を出して見たのですが
こういう場合、みなさんどのように解決されますか?
template <int N> struct rt{int rdm(){return N*(rand()%128);}
R<rt<3> > r;
↑この場合、途中で引数を変えたいと思った場合毎回インスタンスを作る必要がある点が若干面倒です。
また、整数引数しか使えません
関数でやる場合は引数変更は楽ですが
Traitsにあたるものが増えてくると関数の組み合わせ爆発が大変です。
手法にこだわりはないのでこのやり方が楽、などあればきいてみたいです。



151 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 20:35:21 ]
struct r{ int rdm(){ return rand() % 128; } };
struct rs{ int rdm(){ return rand() % 7 + 60 } };
template<typename Ty> struct rc{ Ty value; int rdm(){ return value * (rand() % 128); } };
後はrc::valueのゲッター書くなりセッター書くなりしろ。

152 名前:150 mailto:sage [2009/01/19(月) 21:33:25 ]
>>151
ありがとう。参考にします。

153 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 23:44:40 ]
STL コンテナでアロケータを指定する方法を真似するのは、何か都合が悪いの?

template <class T=r > struct R {
 T t;
 R( const T & t_ = T() ) : t(t_) {}
 int rdm() { return t.rdm(); }
};

R< random_with_number > rn( random_with_number(3) );


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






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<39KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef