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 あたりに。
81 名前:デフォルトの名無しさん mailto:sage [04/12/12 21:56:38] こんどからusageの替わりにusugeを使おう。
82 名前:デフォルトの名無しさん mailto:sage [04/12/14 23:42:13] 偉大なるstroustrupに敬意を示すため 我々C++プログラマは、むしろ積極的にhageを使っていくべきじゃなかろうか
83 名前:Addicted to C++ ◆nrBjarne.g mailto:sage [04/12/14 23:44:30] むしろ積極的にトリップにBjarneを入れていくべきではないだろうか。
84 名前:デフォルトの名無しさん mailto:sage [04/12/16 16:49:49] >>78 意味不明。
85 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:28:50] つまり VC++6使ってる奴は貧乏人 っていうことですよ
86 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:38:24] 決して割れに手を出さない分、高貴とも言える
87 名前:デフォルトの名無しさん mailto:sage [04/12/16 18:12:58] 金が無いならvc2005 betaでも使えば良いだろ。
88 名前:デフォルトの名無しさん mailto:sage [04/12/16 19:35:46] 金が無いならVCTKでも使えば良いだろ。
89 名前:デフォルトの名無しさん mailto:sage [04/12/16 21:13:44] 金がないならハンドコンパイルすればよいだろ。
90 名前:デフォルトの名無しさん [04/12/17 11:45:57] Boost.Spirit見てて思ったんだが、 同じようにSQLクエリをC++で記述できないもんかな。 sql.select( Person.name, Person.sex ).from( Person ).where( Person.age>=20 ); ってな感じで。
91 名前:デフォルトの名無しさん mailto:sage [04/12/17 12:40:12] >>90 わらった。変態すぎ。
92 名前:デフォルトの名無しさん mailto:sage [04/12/17 13:36:33] >>90 ちょっと面白そう
93 名前:デフォルトの名無しさん mailto:sage [04/12/17 23:54:26] >>90 今作ってるオリジナル言語のコンパイラが完成したら 開発に着手する気でいたw
94 名前:デフォルトの名無しさん mailto:sage [04/12/18 13:24:58] >>90 ttp://www.tietew.jp/cppll/archive/330
95 名前:デフォルトの名無しさん [04/12/25 14:39:04] T1 と T2 が整数型という前提で sizeof(T1) > sizeof(T2) の時に T2型の整数をゼロ拡張してT1型の整数に変換するテンプレート関数 はどのように書けばよいでしょうか? template<class T1, class T2> T1 zero_ext( const T2& x );
96 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:01] ゼロ拡張? 意味不明。 俺用語を使うな。
97 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:07] >>95 template<class T1, class T2> T1 zero_ext(const T2& x) { return static_cast<unsigned T1>(x); }
98 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:05:50] >>96 (´゚c_,゚` ) プッ www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-32,GGLD:ja&q=%E3%82%BC%E3%83%AD%E6%8B%A1%E5%BC%B5
99 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:47:33] ISO C++の4.7.2にあるunsignedのintegral conversionの事でしょうね。 zero expansionってのはアセンブラの世界では良く使うね。
100 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:51:47] >>97 それだと、T2が符号付きのときに符号拡張されちゃうんじゃないか?
101 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:05:04] じゃあこうか? template<class T1, class T2> T1 zero_ext(const T2& x) { return static_cast<unsigned T1>(static_cast<unsigned T2>(x)); }
102 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:06:37] そもそもunsigned T1とかできるのかな?
103 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:15:08] よく知らんが、boost::numeric_convertionってそういう目的のライブラリじゃないのかな?
104 名前:デフォルトの名無しさん [04/12/25 19:10:36] template<typename T, typename Container = std::map<Key, T>, typename Key = std::size_t> class Tree { }; こういう順番にテンプレート引数を取りたいのですが、どうしたらいいでしょうか? Tree<int, std::vector<T> >としたときKeyは当然不要なので省略できるようにしたいのです。
105 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:13:29] テンプレートのデフォルト引数は一つまでだYO
106 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:15:55] 無理じゃね?
107 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:21:17] Tree<std::vector<int> > としたときTは当然不要なので
108 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:47:26] struct use_default{}; template <typename T, typename Container = use_default, typename Key = use_default> class Tree{/* がんばって情報を取り出す */}; boost::iterator_adapterの実装が参考になるかも試練。
109 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:57:26] おまえらぶーすとに踊らされすぎだぶー
110 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:02:46] boostは一緒に踊ってくれる数少ない仲間なんだよ。
111 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:04:43] 踊る阿呆に見る阿呆、同じ阿呆なら踊らにゃソンソン
112 名前:デフォルトの名無しさん mailto:sage [04/12/25 21:42:20] 踊らにゃシャンソン
113 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:01:15] >>111 必ずどちらかの阿呆であるという無理な前提で人を煽るその言葉は大嫌いだ。
114 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:24:27] 2択でもなく決め付けだしな 詭弁だ
115 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:27:59] なんで踊るよりも見る方が損なのかがわからん。 踊ったら疲れるだけなのに。
116 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:47:49] 理論(見る)より実践(踊れ)てこと
117 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:51:29] >>115 踊ることが楽しいと言いたいのだろう。
118 名前:デフォルトの名無しさん [04/12/25 23:20:36] >>101 VC++ 7.1 だと unsigned T1 のような書き方は構文エラーになりました。
119 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:16:22] C++Templateの便利な機能のうち Javaでは実現できないことってなんなのかを 教えてください。
120 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:17:25] 特殊化
121 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:18:39] ていうかほぼ全部?
122 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:13:48] >>119 使ってすぐ分かるのは、コンテナから取り出すときにナローイング変換しなくていいこと。
123 名前:120 mailto:sage [04/12/26 01:16:18] あれ? Java Genericsかと思ったけど、Javaか…
124 名前:デフォルトの名無しさん mailto:sage [04/12/26 04:53:50] JavaのGenericsってただの自動キャストでそ? C++のtemplateとは比較にならないのでは・・・
125 名前:デフォルトの名無しさん mailto:sage [04/12/26 08:56:50] .NETのgenerics、試みは面白い。
126 名前:デフォルトの名無しさん [04/12/26 13:31:14] で、結局具体的にどんなことがJavaにできなくて C++で出切るんですか? C++ではこんなに簡単に書けるのに Javaで書くとこんな風になっちゃうって例を 出していただけると助かります。 いろいろ考えたんですが、特別優れた使い方ってのが 思いつかなかったので。 もしかして、ないのかな・・・
127 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:01:11] クマー
128 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:13:40] .| | | | | | | | .| | | レ | | | | ∩___∩ | | | J | | | | ノ\ ,_ ヽ .| レ | | レ| / ●゛ ● | .J し | | | ∪ ( _●_) ミ .| し 彡、 |∪| | .J / ∩ノ ⊃ ヽ ( \ / _ノ | | \ " / | | Javaしらね。覚える気もねえし \ / ̄ ̄ ̄ /
129 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:56:55] >>126 Java Genericsは分かるの?
130 名前:デフォルトの名無しさん mailto:sage [04/12/28 00:49:18] >>126 「オブジェクト指向をベース」にプログラムを書いた場合 JavaのGenericsで全てが事足りる。
131 名前:デフォルトの名無しさん mailto:sage [04/12/28 01:22:25] 速度以外はな。
132 名前:デフォルトの名無しさん mailto:sage [04/12/28 05:44:30] 素人が首突っ込んで申し訳ないが Javaには専用プラットフォーム必須なんだよね? 要はエミュレータ?
133 名前:デフォルトの名無しさん mailto:sage [04/12/28 08:33:23] >>132 プラットフォームの意味わかってんのか?
134 名前:デフォルトの名無しさん mailto:sage [04/12/28 12:28:32] >>126 Lokiのような変態的なライブラリは無理じゃないの?Generics知らんけど。
135 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:19:32] その変態なLokiなんですけど、TYPELISTって動作遅くしないですか? 継承によって、多義性をサポートさせるのはよい。 コンパイル時にその多義性を作り出すのも良い。 けど、継承って、実行速度おそくなりませんか?
136 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:24:09] >>134 あれはオブジェクト指向を捨ててるからな。 オブジェクト指向で書き直せばもっときれいなのが作れるよ。
137 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:38:33] >>135 Modern C++ Designを読めば分かるけど、 LokiのPolicyは仮想関数を使ってないから…
138 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:22] >>135 TYPELISTはコンパイル時のみ。 継承なしで巨大ライブラリを作れる人、使える人はそうしたら良かろう。 Cで書いてあるgtk+みたいなのでも継承しているけどね。
139 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:58] 大抵は問題にならん
140 名前:デフォルトの名無しさん mailto:sage [04/12/28 14:51:39] lokiはデザパタではなくてboost::mplに似ているわけか。
141 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:23:42] たくさんのレスに感謝。 >137 Modernは読んでます。内容を完全に理解したとは言いがたいですが。 けれども、Efficient読んでるとvirtual使わない継承でも動作遅くなるよ〜。 と書いてあるもので。 「本質的な問題ではない。」が結論なんですけどね。 >138 その通りです。 継承無しでライブラリの作成…作ったことありませんがゾッとします。 >139 >大抵は問題にならん。 継承しまくったオブジェクトを生成&削除しまくるプロジェクトとか (サーバー用途?)ではどうでしょうか? ModernのTYPELISTの継承構造見ていると、継承の無駄が多い気がして。 p237のクラス階層とかってつまりは。 class AbstractEnemyFactory :public AbstractFactoryUnit<Soldier>, public AbstractFactoryUnit<Monster>, public AbstractFactoryUnit<SuperMonster> なわけで。 実際に巨大プロジェクトの現場を経験したことのない人間の戯言ですが。
142 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:27:43] >実際に巨大プロジェクトの現場を経験したことのない人間の戯言ですが。 自覚しているんなら黙れ。っーつか氏ね。
143 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:28:43] >>142 お前こそ黙っとけよ。
144 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:31:01] >>143 バーカ
145 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:38:54] >っーつか氏ね。 OK。発音してみよう。
146 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:48:24] >>141 それ、TYPELISTなしで書いた方が可読性悪いでしょ。 TYPELISTは実行時に負担ないしね。コンパイル時にやるから。 typeid listじゃないから。
147 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:51:47] >継承しまくったオブジェクトを生成&削除しまくるプロジェクトとか >(サーバー用途?)ではどうでしょうか? メモリ確保&解放は一瞬。メモリに書き込むことは多少重いけど。 ただ、ゲームなんかのメモリ資源が超少ない環境では メモリのフラグメントなんかが起こって、メモリが足りなくなることはある。
148 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:01:22] いや、new/deleteは重いけど、 継承しているしていないに関係ない。 継承して複雑な部分を作り出す構造だと、 一つのオブジェクトの中にまとめられるから、 利用するメモリチャンクの数が減ることも考えられる。 Cでやると、ポインタの嵐になって別々の構造体になるから、 malloc/freeを寄り頻繁にする必要がある(事が多い)。 とりあえず、135は、 ・templeteが、compile時のみ働くものであること ・詳解C++(いわゆるAnnotated)を読んで、継承のメモリ利用 を勉強しろ。 分からない奴はいつまでたっても設計ができない。
149 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:03:14] >>148 > Cでやると、 「継承しないでやると、」の方がいいかな。 compositionとinheritanceの違いはAnnotated読んで。
150 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:58:14] みんなRubyのこと嫌いなの?
151 名前:135 mailto:sage [04/12/28 18:54:45] 自分でTYPELISTでAbstractFactoryを組んで、それをいじくりまわしてみました。 結果:変わらないですね… なんか狐につままれた感じのするのは私だけでしょうか。 >・詳解C++(いわゆるAnnotated)を読んで、継承のメモリ利用 を勉強しろ 多分これが今の私に必要なんでしょうね。 はい。いろいろとがんばってみます。 皆様ありがとうございました。
152 名前:151 mailto:sage [04/12/28 22:14:45] >結果:変わらないですね… コンパイル時間が変わっていると思うけど……
153 名前:デフォルトの名無しさん [04/12/29 01:08:18] mmap+boost で、データ構造のシリアライズがやりたいです。 具体的には、 1、データファイルをmmap で巨大なヒープとしてメモリに貼り付ける。 なお、このとき、毎回同じメモリアドレスに貼り付ける必要性がある。 2、boost の new をいじくり、すべてそのmmapされたヒープの中でのみ allocate されるようにする。 以上で、データ構造がそっくりシリアライズできるような気がするのですが、 どうやってやればいいでしょうか。
154 名前:デフォルトの名無しさん mailto:sage [04/12/29 01:32:26] boost::serialize使えばいいのに
155 名前:デフォルトの名無しさん mailto:sage [04/12/29 01:33:17] boost::serializationだった
156 名前:デフォルトの名無しさん [04/12/29 03:49:42] ええっと、それだと、一度すべての変数をずるずるっと舐めることになりますよね。 そうじゃなく、効率も考え、変数空間全体をmmap でファイルに貼り付けたいんです。
157 名前:デフォルトの名無しさん mailto:sage [04/12/29 03:53:06] 舐めるならレロレロとかチュパチュパじゃないか? ずるずるってナニ?
158 名前:デフォルトの名無しさん mailto:sage [04/12/29 03:54:17] つーか >毎回同じメモリアドレスに貼り付ける必要性がある。 これで破綻してるとは思わないのか
159 名前:デフォルトの名無しさん [04/12/29 05:06:16] それはすくなくともLinuxなら可能です。 とくに、今後の64bit Linuxなら、アドレス「空間」はいくらでも余ってるので、 何の問題もないでしょう。
160 名前:デフォルトの名無しさん mailto:sage [04/12/29 17:23:10] >>159 ^^
161 名前:デフォルトの名無しさん mailto:sage [04/12/29 17:48:45] >>153 やりたいようにやればあ。 絶対アドレス依存じゃないヒープ保存で有名なのはEmacsとTeX。 絶対アドレスに依存するのはちょっと面倒だね。 C++のオブジェクトを直接張り付けるんじゃなくても、 wrapper classで仮想的に扱えるよね。
162 名前:デフォルトの名無しさん mailto:sage [04/12/29 21:34:37] おまえら、「boost の new」の意味はわかってるのか? 漏れにはわからん。
163 名前:デフォルトの名無しさん mailto:sage [04/12/29 21:39:05] 「boostで使うnewとかもひっくるめて自分でglobalなoperator new()をオーバーライドしちゃいます」 という意味だと思ってた
164 名前:デフォルトの名無しさん mailto:sage [04/12/29 21:53:12] >>163 そうなると、「mmap+boost で」っていうのがわからん。 boost も template も関係ないじゃないか。
165 名前:デフォルトの名無しさん mailto:sage [04/12/29 21:58:22] ううむ。確かに。 boostの機能のキの字も使ってないもんなぁ。
166 名前:161 mailto:sage [04/12/29 22:00:47] そもそもシリアライズじゃないし(w
167 名前:デフォルトの名無しさん mailto:sage [05/01/04 00:56:10] 知り合いs
168 名前:デフォルトの名無しさん mailto:sage [05/01/06 00:15:21] GC(参照カウント方式)に使えるポインタオブジェクトで オブジェクトのconst修飾が参照先のconst修飾に対応した クラスってないでしょうか Boost流だとこんな↓感じ? template<typename T> class my_shared_ptr : protected boost::shared_ptr<T> { public: const T * operator->() const { return __super::operator->(); } T * operator->() { return __super::operator->(); } // other functions implementation... }; おねがいします
169 名前:デフォルトの名無しさん mailto:sage [05/01/06 00:22:41] >>168 そんな感じでいいんじゃないの?
170 名前:168 mailto:sage [05/01/06 00:26:23] はい、ありがとうございます ただ、既存のライブラリでいいのはないかと思いまして・・・
171 名前:デフォルトの名無しさん mailto:sage [05/01/06 01:16:46] >>170 Boost は「既存のライブラリ」以外の何だというのかね?
172 名前:デフォルトの名無しさん mailto:sage [05/01/06 02:12:11] >>168 ちなみにshared_ptr<T const>を嫌う理由は何ですか?
173 名前:デフォルトの名無しさん mailto:sage [05/01/06 06:31:17] 重い
174 名前:デフォルトの名無しさん mailto:sage [05/01/06 10:28:20] プログラム全体の動作に致命的なほど遅くはなんねぇよ
175 名前:デフォルトの名無しさん mailto:sage [05/01/06 10:56:57] 何の要件もなしに「重い」と言って切り捨てる >173 も、 何の前提もなしに「致命的なほど遅くはなんねぇ」という >174 も、 同じ程度に浅はかである。
176 名前:デフォルトの名無しさん mailto:sage [05/01/06 11:01:20] >>175 それを否定してしまったら何もかけなくなっちゃうよ。
177 名前:デフォルトの名無しさん mailto:sage [05/01/06 11:09:22] >>176 175が何を否定してるんだ?
178 名前:デフォルトの名無しさん mailto:sage [05/01/06 11:10:18] 日本の将来
179 名前:電波系赤の他人 mailto:sage [05/01/06 11:13:22] 俺も人格も否定しているような気がする。
180 名前:デフォルトの名無しさん mailto:sage [05/01/06 18:37:00] >>172 嫌というほどでもないんですが、 コンパイルが遅そうとか、その程度です const my_shared_ptr<T> get_obj_ptr() const; my_shared_ptr<T> get_obj_ptr(); より、 shared_ptr<T const> get_obj_ptr() const; shared_ptr<T> get_obj_ptr(); の方が意味的に適切だとは思うんですが 自分で書くのめんどうなので、とりあえずboost::shared_ptrでいいや・・・
181 名前:デフォルトの名無しさん mailto:sage [05/01/06 20:30:30] こういうのどうですか? #defineBEGIN_JUNK( __Super, __Misc ) \ template< int _N >struct __Junkyard{ enum { _junk_no = __Junkyard< _N - 1 >::_junk_no }; }; \ template<> \ struct __Junkyard< __LINE__ > : public __Super::_junk \ { \ enum { _junk_no = __LINE__ }; \ typedef __Super::_junk _prev; \ __Misc; \ }; \ typedef__Junkyard< __LINE__ >_start_junk; \ #defineREDEF_JUNK( __Misc ) \ template<> \ struct __Junkyard< __LINE__ > : public _prev_junk \ { \ enum { _junk_no = __LINE__ }; \ typedef _prev_junk_prev; \ __Misc; \ }; \ #defineEND_JUNK() \ typedef_cur_junk_junk; \ 長いので詳細は↓に書いてあります。 www2.odn.ne.jp/freelife/Junkyard.htm 割と使えると思うんだがどうだろう?