【C++】template 統合スレ -- Part2
>>934 そう、そんな感じです。
で、実際に使うときに、わざわざ使いもしない型T1、T2をコンパイラに指定するのは
無駄のような気がしたので、もしかしたら特殊化以外に方法があるのかと思いましたが、
T1とT2の型をコンパイラに伝えるのは全然無駄ではなかったですね。むしろないと処理できない。
templateによる汎化について詳しく書かれた本は
Modern C++ Design以外にないのでしょうか。
洋書でも構わないので進言願います。
>>938 C++ Templates: The Complete Guide
Modern C++ Designのどこが気に入らなかったのか知りたいな
>>939 どもです。読んでみます。
>>940 むしろ気にいったのでもっと掘り下げたいなあ、と。
継承よりtemplateで汎化した方が良い例をもっと見てみたかったので…。
>>941 > むしろ気にいったのでもっと掘り下げたいなあ、と。
それなら、C/C++ Users Jounal を定期購読するといいんでないか?
あーそういや今月号届いてないような。おかしいな・・
>>943 おお、どもです。
C++ Reportなぞも取ってみたいとは常々思っているのですが、
海外の雑誌ってネットから申し込んで
簡単に定期購読できるものなのでしょうか?
…と、ここまで書いて己が教えて君であることに気付いてしまったので
回線切らずに検索してきます。失礼しました。
ウメ
947 :
デフォルトの名無しさん:03/09/24 13:24
>>947 …… って落ちついて見れば、そんな巨大でも無いな。
lamda とか、mpl とか使っているから、やたら理解し難いけど。
949 :
デフォルトの名無しさん:03/09/24 13:54
950 :
デフォルトの名無しさん:03/10/03 21:27
メタプログラミングっていつどのようなときに使えばいいのかわからない。
もだーんC++デザイン読んでない俺にもわかるように熱く語ってくれぃ。
田舎にゃーうってないんだよな・・・、どの本屋いっても糞ナ本しかうってない・・・。
アマゾンに個人情報さらすしか手段ないのか・・・。
952 :
デフォルトの名無しさん:03/10/05 16:37
>>950 MPL、LOKIなんて飾りです。偉い人にはそれが分らんのです。
漢はCでのマクロプログラミングです!
>>952 じゃ〜、何であなたはこのスレ閲覧してんの?
>>953 C++でマクロプログラミングをするには、
対象言語としてのC++が複雑すぎるんです。
>>954 まぁでも、boost::preprocessor は便利に使わせてもらってるよ。
C でも boost::preprocessor 使ってますですよ。
// いや、仕事とかじゃないし(´∀`)
template <bool hoge=true>
struct DefalutArgs{
typedef int type1;
typedef char type2;
typedef double type3;
typedef float type4;
};
template <>
struct DefalutArgs<true>:public DefalutArgs<false>{
typedef unsigned int type1;
typedef unsigned char type2;
};
template <typename T=DefalutArgs<>::type1>class Test{
};
int main(){
std::cout << typeid(DefalutArgs<>::type1).name() << std::endl;
std::cout << typeid(DefalutArgs<>::type3).name() << std::endl;
return 0;
}
ふと思いついた、後で変更可能なデフォルト引数。
上書きしなければ初期値もそのまま使える。
>>958 なんとなくはやりたいこととその仕組みはわかるんだけど、
いまいちピンとこないのでもっとわかりやすい命名規則でおながいします。
( 特に hoge なんてサイテー。 )
へぇ〜、デフォルト引数って特殊化出来たのね。
でも変更しようと思ったこと無いからな。
変更したらデフォルトの意味がなくなるような気がするし。
そろそろジスレを立ててもいいかな?
良いと思いまつ。
しかし、spiritはなんで先読みじゃねーんだよヽ(*`Д´)ノ
セマンティックアクションが書きにくいったらありゃしねぇ
それがspiritの魂なのさ!ウヒョヒョアヒャヒャヾ(゚∀゚)ノ
誰か、「次スレ」のリンク貼れよ。
低レベルな質問でもうしわけないんですが、
通常のiteratorとreverse_iteratorのどちらも代入できて
インクリメントなどが適切に動く型ってないんでしょうか?
この2つを共用体でまとめて、判別用のbool値と
いっしょにまとめた構造体を作るとか
あるいは実行時型付けとかしないといけませんか。
すみません。
今、ある地点クラス
class Point
{
int x;
int y;
...
}
を1次元に並べて
typedef list<Point> Path
のような経路クラスを作ってます。
その上を往復するように移動する人クラスを
class Walker
{
Path* ptr_path;
Path:const_:xxxx_iterator itr;
...
}
のように用意して、
経路をpathの順方向に辿るときと逆方向に辿る動きを実装するのに
iteratorを使いたいんです。
>>968 ++で進んで--で戻れ。
…ってことではなく?
ああ、説明不足でしたね。
「向き」の情報は別に持っていて
その向きにあわせて「”前”に進む」メソッド、「”後”に戻る」メソッド
を呼び出す形で扱いたいんです。
先に書いたように、
bool値で向きの情報を持っておいて
処理を分岐させれば一応
望むものはできるとは思うのですが……。
iteratorが辿る向きによって2種類存在するなら
それを利用できないものかと欲を出しているのですよ。
どうも私の想定しているやり方ではできないという前提で
考えてくださっているようなので、
単純化した例ではない全体をさらしておきます。
次スレ準備のためにレス数不足のようでしたらおっしゃってください。
今スレでは質問を控えさせていただきます。
まず、一つのPathの上で複数のWalkerが動きますので
Path自体をreverseさせるのは無理です。
さらに、移動する経路というのも、実は単なる一本道の往復路でなくて、
上に示したところのPathが複数とそれらが複数つながったノードで
構成されるネットワーク構造になっているのです。
(首都圏の電車の路線図などを想像してください)
で、このネットワーク状マップの上をwalkerが動くわけですが、
自らの進路を完全にPointの集合で持つのは無駄ですので、
一直線上にPointが並んでいて分岐がない部分はPathという形でリスト化し、
さらにその集合で進路を表す、という方針で作成しているのです。
が、そうするとそれぞれのPathにおいて進む向きの
情報をどう持つかが微妙なことに〜という状態なんです。
かなり崩壊気味の日本語を書かれる方ですね。
何が言いたいのかさっぱり分かりません。
つーかSTLのソース読めばいいのに
すみません。
もう少しSTLの勉強と実践してみます。
わざわざありがとうございました。
そもそもendとrendをどうやって使い分けるつもりなんだろう…
>>974 そういう時は男は黙ってboost::graph。
でも、reverse_iteratorとiteratorを変換したくなる事はあるなぁ。
何か一発で変換できたりするのかな?
emptyでないことがわかってる時、最後の要素を取ろうと思って
毎回end()を--するのは結構嫌だったり。
> でも、reverse_iteratorとiteratorを変換したくなる事はあるなぁ。
> 何か一発で変換できたりするのかな?
reverse_iteratorのコンストラクタとbase()メソッドでは?
>>977 > emptyでないことがわかってる時、最後の要素を取ろうと思って
大抵のコレクションで、最後の要素への参照を返す back() が提供されてると思うぞ。
end()って--していいの?
>>978 ソレだ!ありがと〜。
>>977, 978
すみません文章が悪かったです。
「最後の要素を押さえたくて」なので、referenceだと都合が悪かったり。
listの尻を押さえておく場合とか。
>>985 反復子を逆反復子にする時、またはその逆の時は一つだけ注意が
必要。
1 2 3 4 5 6 7 8 9 10 という std::vector<int> があったとすれば、
std::vector<int>::iterator pos が 6 を指している時
std::vector<int>::reverser_iterator rpos(pos) としたら rposは
6を指さず5を指す。
これはrbegin()がend()と同じ場所を指すようにするための配慮で、
reverse_iteratorは常に一つ戻った場所の値を取り出す。
同様に
std::vector<int>::reverse_iterator rpos が 5 を指しているなら
std::vector<int>::iterator pos(rpos) で pos は 6を指す。