C++/TemplateMetaProg ..
151:デフォルトの名無しさん
09/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
09/01/19 21:33:25
>>151
ありがとう。参考にします。
153:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/24 14:55:23
>>154
> R<r> a(r()); //error
R<r> a((r()));
でいけるよ
156:デフォルトの名無しさん
09/01/24 15:15:23
ほんとだ、こっちのが短くていいですね。
157:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/24 16:08:53
単に左辺を書かなくても良くなるぐらいの気持ちで書き直したんですが
そもそもtenmplate無くても動きますね・・難しいなぁ
ある意味、template使わなくてもポリシーベースのプログラミングが出来るわけですね
あえてtemplateを使う利点が整理できてないので考えてみます。
>ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
シンプルながら、これは説得力ありますね
159:デフォルトの名無しさん
09/01/24 16:43:24
>>155-156
R<r> a;でいいじゃない。
160:157
09/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:デフォルトの名無しさん
09/01/24 18:32:50
> R<r> a( (r)r() );
たまたま‘r’という短い名前だからそれでいいかもしれんが、
名前が長かったり、さらにネストしたテンプレートクラスだったりすると
書くのも面倒だよ。
他にも
R<r> a = R<r>(r());
とか考えられるけど、やっぱり
R<r> a((r()));
が楽だと思うけどね。
162:デフォルトの名無しさん
09/02/14 00:35:29 BE:1969877186-2BP(0)
age
163:デフォルトの名無しさん
09/03/12 22:20:49
テンプレートの引数にテンプレート渡せるのか〜知らなかった。
これで大分やれることが広がったぜ。ウヒヒ
ていうか、テンプレートの完全な仕様ってどこに行けばみれるの?
164:デフォルトの名無しさん
09/03/12 22:27:47
>>163
ちょうどこっちでその話があったところ。
スレリンク(tech板:758-767番)
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5394日前に更新/39 KB
担当:undef