C++/TemplateMetaProgrammingat TECH
C++/TemplateMetaProgramming - 暇つぶし2ch144:デフォルトの名無しさん
08/10/26 01:21:18
>>143
パッとみて無理っぽいうえにコンパイル単位をまたぐ場合を考えるとさらに無理っぽい。

145:デフォルトの名無しさん
08/10/30 20:35:00
(´;ω;`)

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

147:99
09/01/12 20:40:07
まいど。

どうしても欲しくなったのでマルチメソッドを実装したんだけど、もっと効率的になる改善点てあります?
(詳細)URLリンク(cvs.sourceforge.jp)
(解説)URLリンク(fiercewinds.net)
解説がクソなのは置いといて下さい。

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

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



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

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


149:99
09/01/13 01:15:20
リンク間違えてたので修正します。
(詳細)URLリンク(cvs.sourceforge.jp)

150:デフォルトの名無しさん
09/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:デフォルトの名無しさん
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