1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32] C++ のジェネリックプログラミングの話をしましょう。 以下のスレッドを統合するスレです。 STLスレッド Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html 【C++】Boost使い集まれ! pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?) Generic Programming with C++ Template pc.2ch.net/tech/kako/1008/10085/1008593126.html 【C++】template 統合スレ -- STL/Boost/Loki, etc. pc2.2ch.net/tech/kako/1037/10377/1037795348.html 【C++】template 統合スレ -- Part2 pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち) 【C++】template 統合スレ -- Part3 pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち) 【C++】template 統合スレ -- Part4 pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち) 【C++】template 統合スレ -- Part5 pc5.2ch.net/test/read.cgi/tech/1091522597/ 関連スレ、その他リンクは >>2-5 あたりに。
563 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 02:55:12 ] おまえらの必死さに笑った。 C++の中途半端なtemplate機能でメンテ不能の駄作を量産してる様は、 まるでVBで汎用ライブラリを作る馬鹿とそっくりだな。
564 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 02:57:49 ] ×メンテ不能 ○俺に理解不能
565 名前:デフォルトの名無しさん [2005/05/17(火) 07:37:28 ] あーあ、4,5,6って別々にするわけ?テンプレの意味ねー
566 名前:デフォルトの名無しさん [2005/05/17(火) 07:41:46 ] テンプレートはマクロ www.iba.k.u-tokyo.ac.jp/〜yanai/template_tips.html
567 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 10:05:48 ] >>563 まあ同意。boostとか見てても思うが、言語使用の範囲内でどうにかしようとするから無理が出てくる。 パズルとしては興味深いが、無理やりやってるからどうしてもキモくなる。 新しいプリプロセッサ作ったほうがマシな気がする。
568 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 12:24:00 ] >>566 典型的なアホっぽいが。 exportはComeauでサポートされていることすら知らんようだし。
569 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 12:40:07 ] >>566 > まず最も重要な事実は、templateはマクロであるということである。 そもそも、始めの仮定についてキチンと論証してない時点でアウトだな。
570 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 13:16:28 ] templateはマクロだよ。 マクロと聞いてCやC++のプリプロセッサ(やVBAなどアプリケーション内のスクリ プティング言語)しか思いつかない人に向けた文章ではなかろ。
571 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:01:12 ] >ここではオブジェクト指向に則ったよいtemplateの使い方を模索する。 この時点で道を誤っている気が。
572 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:29:53 ] templateの明示的インスタンス化なんて、少し考えれば 使い道などろくに無い機能だとわかるだろうに しかも使う必要も無い機能だし それにこだわってる時点で、ダメだなそのページ
573 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 18:56:42 ] ネタをまじめに叩くなよ
574 名前:デフォルトの名無しさん [2005/05/17(火) 20:39:55 ] ねたじゃねーし templateはコンパイルする前に展開されるからマクロなの
575 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 20:42:50 ] コンパイルする前に展開しちゃったら タイプセーフは無理じゃないの?
576 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 20:47:38 ] いいよわからん奴は無理に使うな
577 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:03:14 ] マクロで使える構文を限定的にして型を認識させたのがテンプレート
578 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:12:28 ] みんな好き勝手に「マクロ」の意味を定義して使ってるから、話が噛み合わない だけでしょ。
579 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:56:51 ] おっと、ここで578が正式にマクロの定義とやらを教えてくれるらしいぞ
580 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:03:42 ] なにこの意味不明な反応
581 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:21:02 ] 付き合うだけ無駄でつ
582 名前:デフォルトの名無しさん [2005/05/18(水) 07:21:54 ] 普通のマクロでも引数の数を変えられるようなことはできないから >>553
583 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 00:28:48 ] VC7.1で std::list<int>使うとポインタの保存のためか std::vector<int>の3倍近いメモリ使うんだが、 省メモリな実装のlistって無理なのかな?
584 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 00:55:57 ] >>583 SGI STLのstd::slistなら、一方向リストだけど、少しでも少ないかも。
585 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 01:45:41 ] リストすら作りを理解してないのかよ。
586 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 12:25:58 ] std::vectorのresizeコストが気になるようならstd:;dequeとか
587 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:07:18 ] つうか双方向リストは最低2つはポインタが必要なんだから当たり前の気がするんだが
588 名前:583 mailto:sage [2005/05/21(土) 00:47:56 ] サイズは可変で大きい、挿入削除が定数時間(->list)、省メモリ(->vector) を同時に満たしたかったので... とりあえず挿入削除の速いlistを選択したけど、以外とメモリ食うって分かった。 小規模のvectorをlistで繋ぐか584さんのslistつかうのがいい気がしてきた。 双方向リストだとポインタが64bit化したらさらに事態は悪化するのも気になるし...
589 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:53:20 ] だから小規模なvectorをつなぐぐらいならdeque使えってばよ
590 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:54:03 ] >>587 要素が int で、双方向のポインタがあるわけで それぞれサイズが同じなら、int の 3倍ですね。 >>585 も指摘してますが、糞当たり前です。
591 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:54:46 ] >588 データ構造の勉強からやり直して来い。
592 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:55:27 ] s/int の/1要素あたり int の/
593 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:56:22 ] >>588 中身の小さいオブジェクトを入れると、相対的にlistはポインタなどの管理部分が 大きく見えてしまうからねえ。 ケースバイケースで使い分けるしかない。 それとstd::slistのiteratorは、forward iteratorなので、bidirectional iteratorのlist に比べると実行効率の悪いメンバ関数がいくつか存在するから、その点もよく確かめてね。
594 名前:583 mailto:sage [2005/05/21(土) 01:04:49 ] dequeだと 中間への挿入、削除した場合に 参照と反復子が死滅。
595 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:05:46 ] >>588 テキストエディタみたいに、挿入が同一箇所に連続して発生するようなら ギャップベクタを検討するといいかも
596 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:34:23 ] >>594 それが問題になるなら、もう list しかないんじゃないかなぁ。 「小規模のvectorをlistで繋ぐ」なんてのも、全然ダメだろ。
597 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:43:48 ] もはやtemplateの話題じゃなくて、「データ構造とアルゴリズム」の世界だな。
598 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 02:11:25 ] listとかvectorはあるのに、より優れた概念のS式がないのはおかしい
599 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 03:42:02 ] >>598 あなたね(汗 インタプリタじゃないんですから。
600 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 05:55:52 ] >>599 もっと詳しく。 ・・・って言っても無駄か。 何もわかってないくせに噛み付いてるの見え見えだもんな。
601 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 08:25:20 ] S式ってツリー構造じゃ無かったっけ?違った?
602 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 08:41:31 ] >>600 赤黒木だけじゃ足りないってのかい。
603 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 09:18:31 ] >>597 STLネタがそっちに向かうのは自然だと思うけど?
604 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 09:22:59 ] > つうか双方向リストは最低2つはポインタが必要なんだから当たり前の気がするんだが 直前の要素のポインタと直後の要素のポインタの排他的論理和演算結果を保持しておけ。 そうしておけばポインタ1つで双方向からリストをたどることができる。 実行時にそれなりのコストはかかるが、、、
605 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:01:07 ] >>604 結局サイズは変わらないわけだが。 しかも「ポインタ同士のXOR」?ワケワカラン。
606 名前:604 mailto:sage [2005/05/21(土) 10:23:45 ] 以下のようなリンクリストがあったとする。 A‐B‐C この時、B のポインタ領域には &A ^ &C となる値がセットされることになる。 順方向でA、Bまで読み込んできた場合、Aのアドレスは判っているはず。 このため、&A ^ (&A ^ &C) を計算することでCのアドレスが取得できる。 同様に逆方向でC、Bまで読み込んでいる場合、Cのアドレスは判っているため、&C ^ (&A ^ &C) を計算することでAのアドレスが取得できる。 これが magic list というデータ構造。
607 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:35:12 ] >>606 代償としてイテレータのサイズが大きくなるから、使い道は微妙だけどな。
608 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:43:01 ] >>606 ふーん。 std::list の実装に使われてるのは見たこと無いんだけど、 標準コンテナの実装としては何か問題があるのかな? と考えたら、イテレータを取得した後に要素の削除・追加をするとマズイような気がした。
609 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:44:00 ] >>604 リストを変更しないときのコストはたいしてかからないんじゃないか。 簡単なループの場合、movl (%eax),%eax が xorl (%eax),%eax になるだけだろう。 >>607 イテレータのサイズなんて問題になることがそうそうあるとは思えんが。 前後に追加削除があるとイテレータが無効になってしまうから std::listとはコンパチにならなくなることの方がまだ問題になりそうだ。
610 名前:604 mailto:sage [2005/05/21(土) 10:50:55 ] >>607 イテレータのサイズとリンクリストに保持される各要素のデータサイズを同列で比較するのもどうかと思うが。 イテレータにポインタを2つほど追加したところで、8バイトしかサイズは増えない。 (処理が複雑化する分、イテレータオブジェクトのサイズはもう少し増えると思うが。) しかし、双方向ポインタにしてしまうと、各要素毎に4バイトの投資が必要となる。
611 名前:604 mailto:sage [2005/05/21(土) 10:58:43 ] >>608 >>609 確かにイテレータの取得後に前後の要素が追加削除されると痛い。 排他制御の問題を抱え込むから、std::list との互換性は考えない方が吉かと。
612 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 11:12:46 ] >>609 > 簡単なループの場合、movl (%eax),%eax が xorl (%eax),%eax になるだけだろう。 訂正。これ間違い。xor+mov*2(or xchg)になるな。
613 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:18:22 ] > サイズは可変で大きい、挿入削除が定数時間(->list)、省メモリ(->vector) データの格納にset使うのってやっぱダメなのか? setの中身はconst扱いだけど、外してswapして取り出して消して使ってるけど。 挿入時もヌルデータ入れて跡で要素をswapしてるんで無駄なコピーも出ない用に工夫して、、、 、、、、 vectorはサイズ増えると勝手に自分のコピー作るんで、reserveしなきゃならんので嫌だ。 lispは探索が遅いし。mapはそんなものに使うのもったいないし。 結論 : set使え!
614 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:31:16 ] setが泣いてるぞ
615 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:31:37 ] listのメモリ効率が気になるような状況でsetなんか使えるかよ つーか、dequeって要素へのアクセスもそこそこ速くサイズ変更のコストも最小限なのになんで使われんのか。
616 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 03:41:02 ] >>615 dequeって要素へのアクセスもそこそこ速く ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 環境によってはlist並みに遅いわけですが何か? OSやCPUは敢えて書かないが、STLportとかSTLportとかSTLportとか。
617 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 06:50:59 ] >>606 C++ でポインタにビット毎の論理演算なんて 吉外じみた真似、よく平気で出来ますね。
618 名前:604 mailto:sage [2005/05/22(日) 08:36:41 ] >>617 坊やだな、、、 ポインタと言えど所詮はビット列なのだよ。
619 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 08:39:59 ] >>618 reinterpret_castとか使わないといけないんだろ? 環境依存イクナイ(・A ・)!
620 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 08:55:43 ] >>606 面白いなぁ
621 名前:604 mailto:sage [2005/05/22(日) 08:55:52 ] >>619 reinterpret_castが即、環境依存につながるとは新鮮な考え方だな。 同じ環境内でキャストして、同じ環境内で元に戻すのであれば、環境依存も何もないだろうに(それを環境依存というのなら、コンパイラが吐くコードはすべて環境依存になるぞ)。 それとも、そういうことすら期待できない処理系が現存するというのか? (そんなのが出てきた時点で reinterpret_cast は言語仕様から外されるだろうて。)
622 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:07:29 ] >>621 愉快な香具師だなお前。 C++の実装と進化の§14.3.3(P420)読んでみろ。
623 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:09:30 ] >>622 ○C++の設計と進化 ×C++の実装と進化 それから、規格票を優先しろ。
624 名前:604 mailto:sage [2005/05/22(日) 09:17:26 ] その本は持ってない。 引用の範囲内だろうから、出典を明記して引用してくれ。 内容を咀嚼して説明してくれてもよいぞ。
625 名前:620 mailto:sage [2005/05/22(日) 09:35:20 ] 俺の面白いは純粋な意味であって、622と同じ意じゃないですよ
626 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:38:55 ] 5.2.10 Reinterpret cast 4 A pointer can be explicitly converted to any integral type large enough to hold it. The mapping function is implementation-defined [Note: it is intended to be unsurprising to those who know the addressing structure of the underlying machine. ] 5 A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value; mappings between pointers and integers are otherwise implementation-defined. 要するに規格としてはポインタ型を整数型にreinterpret_castして その値をそのままポインタ型に戻す操作以外は完全に実装依存
627 名前:604 mailto:sage [2005/05/22(日) 09:57:53 ] 「5.2.10 Reinterpret cast」の真意は、整数型にキャストし、演算後の《変更された値》をポインタにキャストし戻したとしても、それはポインタとして無効であるということだけだと思うぞ。 一例を挙げると、配列の特定要素を指すポインタを整数型に変換した後、インスタンスオブジェクトのサイズ分だけ値を加算し、ポインタ型に戻したとしても、次の要素へのポインタにはならないぞ、、、という。 Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。 このため、上記の§5.2.10の規則には抵触しないと思うが? むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。 integral typeにして何の演算も許さず、元のポインタに戻すことしかできないのであれば、そもそもキャストする意味ないし。 まさかシリアライズするのか?、、、ってそれはあまりにも危険だしな。
628 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 10:18:14 ] >>626 ん?問題ないんじゃない? 同じポインタからは同じ整数になり、 同じ整数からは同じポインタになるっていう射影だよね。 この規格表のいいたいところは要するに、 アドレスが16違っている2つのポインタを、 整数に直した時も16違っているかどうかはわからないよ、 というだけの話じゃん。
629 名前:626 mailto:sage [2005/05/22(日) 10:20:55 ] >>627 >Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。 >このため、上記の§5.2.10の規則には抵触しないと思うが? >むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。 5.2.10/5はポインタを整数にreinterpret_castした後,その整数値を「そのまま何の演算も行わずに」 元のポインタ型に再度reinterpret_castした場合,元のポインタ値に復元されることを保証するものです. 604さんのmagic_listでは排他的論理和演算を取るため「そのまま」ではないものの 5.2.10/5は明らかにreinterpret_castによるpointer <-> integerの1対1写像を保証しているものと 読めるため確かにそのとおりですね.626は621に対する指摘のつもりでしたが, いやはや指摘がまったく見当違いどころかむしろ621が正当である根拠になりえますね. これまた大変失礼しました. >>628 上に同じです.失礼しました.
630 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 12:18:47 ] magic list はネタとしては面白いが、現実には滅多に使われない データ構造だな。この手のネタは Hakcer's Delight とか Knuth センセの本を読むとイロイロ転がってるよ。 あと、現実のプログラミングだと、list に int 一個だけ入れるのも 珍しい気がする。手元のコードをいくつか見直してみたが、わりと 大きめの構造体を繋ぐか、スマートポインタを入れることが多い。 いずれにしてもポインタ二個分のメモリなんて誤差って感じ。
631 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 13:39:00 ] 珍しいかどうかは、ともかく メモリ云々行ってた奴は、たぶん初心者だから 初心者の戯言を、あまり真に受けないほうが
632 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:43:55 ] 結論はvector使え、でいいのか?
633 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:54:29 ] >>632 いい
634 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 12:40:40 ] magic list は所詮オナニー
635 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 18:35:46 ] ここはジェネリックプログラミングの話題じゃないのか?
636 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 00:13:26 ] >>635 テンプレートの話題ですよ。尤も、スレタイも読めないなら このレスも読めない可能性、大。
637 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 03:37:35 ] 暇つぶしに作ってた、ヘボコンパイラは出来上がったから 今度は、マジックリストクラステンプレートでも作ってみようかな 作ったらほしい人いる?
638 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 08:09:05 ] >>637 興味はある
639 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 09:47:05 ] 学術的な興味なら。 ソースより測定結果をみたい。listやvectorとの比較つきで。
640 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 15:44:00 ] というか作りかけてる・・・
641 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:41:55 ] できたら >>639 もぜひ。
642 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 23:45:11 ] >>640 637だけど、あなたに任せます
643 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:39:21 ] 小規模だけど多次元配列のポインタがどうしても必要で、newも使いたくないから std::vector<std::vector< ...> > とかで書いてみたんだけど、4次元ぐらいからコンパイル時間が凄くかかる。 ま、コンパイル時に何がおきてるか想像すりゃ当たり前といえば当たり前だし、 コンパイル時だけの問題なので気にしなきゃいいんだけど、 環境になるべく依存しないで(boostとかは使えないし、VC,gcc両方通す必要あり)、 効率の良い方法がありまつかね。std::deque使ってもかわらなさそうだし。
644 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:49:02 ] >>643 その「多次元配列」のインターフェースを必要最小限に絞って、 pimpl なり抽象インターフェースなりでコンパイル単位を分ける。 基本だな。
645 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 02:06:06 ] >>644 dクス。 pimplイディオムは詳しくないので、Exceptional C++でも読んでみまつ。
646 名前:640 mailto:sage [2005/05/25(水) 02:46:33 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/458.txt 面倒だったのでBoost使いました.1.32.0が必要です.すいません. VC++7.1とGCC3.4.2(mingw)でコンパイル確認しています. 勢いだけで突っ走ったので激しく読みにくいコードで申し訳ないです. イテレータが安定じゃないのでsplice系がイテレータ返さないと 使い物にならないので,イテレータ返すようにしてます. std::listのインターフェースであと実装していないのはsortと演算子だけです. でも今日はもう気力残ってません.パフォーマンス測定もしかりです.おやすみなさい.
647 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 04:02:34 ] void reverse() // throw() { head_ = decode(sentry_.code, head_); } 感動してしまった。
648 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 03:43:21 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/468.txt 微妙なバカチョンと例外飛んだときのバグを直しました.多分これで完璧なつもりです. ただ,相変わらずsortだけ面倒なので実装してないです. 指摘されていたこととは言え,このデータ構造イマイチ利点がぼやけてますね. 特にアラインメントの関係でノードのサイズが普通のリストのそれと 同じになってしまう(32-bitマシンでmagic_list<double>とか)場合もあったりで散々かも. 唯一,647さんが指摘されているように要素順の反転を定数時間でできるのが 大きな特色ですけれど,それがうれしい状況ってあるんでしょうか・・・.
649 名前:デフォルトの名無しさん [2005/06/06(月) 11:28:39 ] 質問です。 「具現化によって生成された実体」 = 「ユーザー定義ではないスペシャライゼーション」 という理解でいいの?
650 名前:デフォルトの名無しさん [2005/06/07(火) 22:08:43 ] "template テンプレート パラメータ"の意味が理解できないッス。 "Modern C++ Design" P11 の以下のコードなんですけど、 template <template <class> class CreationPolicy> class WidgetManager : public CreationPolicy<Widget> { ... } ここで template <class> に対して私の頭の中で シンタックスエラーが発生します 。 template<class T> // ノーマル template<> // 特殊化 template<class T=int> // デフォルト引数 template<class T, int=10> // 特殊化とデフォルト引数 というシンタックスは理解できています。 template <class> って何者? 誰か教えてください。
651 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:12:38 ] 省略されてるだけ。 template <class /*T*/> class foo;
652 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:27:41 ] >>651 サンクスです。とすると何らかの型を受け取るけど、 その型の情報は無視するよ、っていうことなんですね。 これをもとにもう一回読んでみます。
653 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:32:56 ] >>650 int f(int i); int g(int); // これも脳内エラーが出るか?
654 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:28:08 ] >>650 例えば、 template< template<class T, class A> class Vector> struct hoge { typedef T value_t; }; typedef hoge<std::vector> hv_t; としても、この時点では”T"はまだ決まってないわけだから 名前付けても使えないのです。 無論、”Vector"もこのままでは使えません。 実際の使用には template< tempalte<class,class> class V> struct hoge { template<class T,class A> struct bind { typedef V<T,A> type; }; }; typedef hoge<std::vector> hv; typedef typename hv::template bind<int,std::allo..>::type のように使うことになりますね。
655 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:31:15 ] 補足ですが、 使えない == typedefできないということです。
656 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:41:11 ] >>654-655 とても650の理解を助けるとは思えない。
657 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 01:10:19 ] 間違ったことは言ってないが、質問の答えとしては完全にズレてるな。
658 名前:654 mailto:sage [2005/06/08(水) 01:22:29 ] >>656-657 この場合 >"template テンプレート パラメータ"の意味が理解できないッス。 と書いてあるところから、名前云々は関係ないと思うのですが・・
659 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 10:35:01 ] >>658 会話になってないな。もういいから喋るな。
660 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 21:38:27 ] >>650 です。 皆さんありがとうございます。 >>654 さんのご意見もとても理解の助けになりました。
661 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:01:15 ] typedf templateってどうなったの?
662 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:13:16 ] template< template<class T, class A> class Vector> struct hoge { typedef T value_t; }; template<class B> typedef hoge<std::vector<B> > hv_t; typeof(hv_t<int>::value_t) i; みたいにtypedefの一文をテンプレート化できるんだっけ。
663 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:32:30 ] >>662 それはだめだろ。 template-templateパラメタのtemplateパラメタ(この場合T) に言及するのは意味的におかしい。