1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
263 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 17:57:01 ] 継続での脱出みたいなことってC++で出来ますか? たとえばこんな関数があったときに、どこかでret=trueになったら 一番最初にfを呼び出した箇所へ飛んで関数を終わらせたい bool f(){ bool ret=false; //処理によってret=trueになったりならなかったり for(int i=0;i<n;++i){ret|=f();} return ret; } gotoで抜けられるのは今いる関数内のループだけだと思うので無理?
264 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:00:50 ] >>263 無理です。
265 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:07:53 ] >>263 たとえば、例外的なことがおきたときにプログラムの実行を中断したいというのであれば、 例外が使える。 だけど、例外は例外的な事以外に乱用すると非常に見通しの悪いプログラムになるから注意。
266 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 20:34:56 ] >>263 bool f(){ //処理によってret=trueになったりならなかったり for(int i=0;i<n;++i){if(f())return true;} return false; }
267 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:19:09 ] makeって使ったことがないのですが、 勉強した方がいいのでしょうか。
268 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:24:24 ] いい
269 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:25:15 ] IDEに任せっきりでmakeってのから逃げまくっていたのですが、 やっぱり勉強します。 ありがとうございます。
270 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:14:10 ] tbbを実用で使い出したけど、メモリ関係の例外が出まくるぞ。 いつもではなくたまに。どうみてもエラーになり得ないところで例外。 そのためにtbb_allocがついているのか。 メモリ管理をtbb専用で全部置き換えれば直るんですか。
271 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:29:16 ] >270 >いつもではなくたまに。どうみてもエラーになり得ないところで例外。 使い方が間違ってて排他処理で失敗してるだけじゃないの?
272 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:49:38 ] そうか。試しに全書き換えでやってみる。
273 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:16:49 ] #define allocator scalable_allocator とやると、 std::allocator がstd::scalable_allocatorになる。 std::allocator がtbb::scalable_allocatorにはどすればいい。 ::がdefineにかけない。
274 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:19:09 ] #define std tbbにしたらエラーでまくり。当然全関数対応しているわけはなく。
275 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:33:30 ] namespace std { typedef xxx::myallocator myallocator; } #define allocator myallocator
276 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:47:52 ] できないです template<typename T> class scalable_allocator; となっていて、テンプレート引数が必要と出ます
277 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:53:11 ] 単純なdefineの文字置き換えで出来ないかと考え中。 stdをstd0に書き換えて、tbbをstdにして、ここでヘッダを読み込み std0をstdに戻せば、善さげなきはする。 別名で存在している関数をdefineで置き換えたらいけそう
278 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:06:20 ] 駄目だった 再定義とか出る
279 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:08:02 ] バグの温床になりそうだな
280 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:25:01 ] 悪夢だ・・・
281 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:26:17 ] アロケータの置き換えはTBBのチュートリアルにやり方が書いてある
282 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:44:48 ] 面倒になってきたので標準装備のみで0から作るぜ
283 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:57:58 ] std::vector<int, tbb::scalable_allocator<int> >などとその都度指定する、 それをtypedefするというのは駄目なの?正統派だと思うのだけど。 C++0xなら template<typename T> using vector_tbb<T> = std::vector<tbb::scalable_allocator<T>>; と書いて、vector_tbb<int>とかvector_tbb<std::string>とか書けるようになるんだけど、 まだ未来の話……。
284 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:26:39 ] if文で真偽値を評価すると真になる要素がいくつあるか数えるのを短く書きたいです。 vector<int> a; // ;;;;;;; int n = 0; for(int i = 0; i < a.size(); ++i) if( a[i] ) n++; これを、 int n = std::count( a.begin(), a.end(), ?? ); ぐらいに短く書きたいのですが、なにかいい方法あります
285 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:30:24 ] ファンクタ使えば?
286 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:37:40 ] int n = a.size() - std::count(a.begin(),a.end(),0);
287 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 07:02:32 ] みなさまありがとうございます。 >>285 クラスを定義しようとすると、結局長くなってしまいますし、離れた場所に書くことになるため気に入りません。 >>286 それが良いですね。勉強になりました。 intの場合はそれでいいのですが、もうすこし一般化して、 if( a[i] >= 0 ) の場合などにも使える方法はありますか?
288 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:10:08 ] >>287 関数内クラス boost::lambda c+0x lambda関数
289 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:49:16 ] >>287 count_if(a.begin(), a.end(), bind2nd(not_equal_to<int>(), 0)) みたいなのをちょっとずつ変えれば
290 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 12:20:46 ] トークン結合演算子##を利用して どうにかならんかね?
291 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:00:32 ] 関数内にしかスコープのない関数って作れる? void foo(){ std::cout << "foo\n"; } の中で void foo(){ void bar(){std::cout << "bar\n";} bar();bar();bar();bar(); std::cout << "foo\n"; } こんな風に。 普通に考えてC++では違反だと思うのだが、 どうにか回避するトリックとか。
292 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:03:15 ] >>291 ローカルクラスを使う。 ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html
293 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:27:52 ] ローカルクラスは結構便利なんだけどなぜかあまり浸透してないよね
294 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:37:37 ] だってtemplateで外部にクラス渡せないし
295 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:05:50 ] 名前空間やモジュールシステムを持たないJavaScriptのような言語ならともかく C++ではあまり必要性がないと思う。ローカルクラスや関数内関数 クロージャはまた別だけど
296 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:08:02 ] ローカルクラスはtemplate引数も使えない。 あと0xでlambdaの型が外部に渡せるのに未だ渡せないローカルクラスは生きている意味があるのかと問いたい。
297 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:13:18 ] fainalなクラスとか? ローカルクラスにできて他にできないことって特にないよなぁ ローカルのほうが散らかさないで書ける場合はあるけど
298 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:17:58 ] 「外部に渡せる」の意味がわからん
299 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:18:33 ] ローカルクラスは昔使ってたけど、関数が大きくなって読みにくくなるんで匿名名前空間に置くようになった。
300 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:27:08 ] ローカルクラスはデストラクタで自動でリソース解放するのにたまに使ったり。 (=スマートポインタのデリーターみたいな感じ。) それとC++0xからはテンプレート引数に渡せるようになるね。
301 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:29:21 ] × デリーター ○ カスタムデリーター です。
302 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:35:29 ] 無名の名前空間だとヘッダに書かないといけないテンプレートクラスに使えないね
303 名前:291 mailto:sage [2010/02/22(月) 00:16:05 ] >>292 ありがとうございます。
304 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:49:41 ] std::string str[] = { "A", "B" }; これってバグの元になる? int i = sizeof(str) / sizeof(str[0]); こうするときとかに。
305 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:52:44 ] 動的配列であってもその実体は内部にelementのpointerを持っているだけなので 中身のデータが違ってもインスタンスの大きさはそれぞれ同じ。
306 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:54:13 ] >>305 即レスかつわかりやすい説明ありがとうございます。 不安がなくなりました。
307 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:58:51 ] C99で絶望するがよい。
308 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:01:14 ] 素直にvector<string>使いなよ。
309 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:03:48 ] >>304-306 何を心配してたのかわかんない。少し解説してもらえるとうれしい。
310 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:08:08 ] std::string a = "asdf", b = "9999999999999999999999999999999"; って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!? std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;; → のーぷろぶれむ
311 名前:304 mailto:sage [2010/02/22(月) 01:15:14 ] >>310 ありがとう。 その通りでした。 >>308 あとあと編集しづらいかな見にくいかなと思ったので。
312 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:47:53 ] クラス内にstatic constのint値を定義して, #defineの代わりにしたいんですが, このint値はそのクラスのインスタンスを生成してなくても, メモリ上に存在するのでしょうか? そうなると,大規模開発では避けるべきなのでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:51:08 ] #defineされた値だとプログラム全体の最適化がされない限り書く度に別々のところに数値が配置されるけどね。
314 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 02:00:33 ] グローバル変数ってlibファイルで共有? モジュールで共有?
315 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 17:47:17 ] >>312 最適化すりゃどうせ消える
316 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:00:22 ] >>312 まあ理屈はそうだけども、 現実的にはその最適化がなされないような状況は 明示的にコンパイルオプションで止めろ! と言わない限りおこんなinじゃない?
317 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:40:04 ] staticなんだからインスタンスは関係ないんじゃ
318 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:56:37 ] templateクラスのstatic変数ならあるいは
319 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 22:40:59 ] hiphopのwindows binaryありますか。phpコードをc++に書き換え、phpから利用できるようになるようなんですが。 ソースコード。 github.com/facebook/hiphop-php
320 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 01:04:04 ] 来月出版の C++テンプレートメタプログラミング 糞本かな? えぴなんとかさんの書いた類の糞本レベル?
321 名前:デフォルトの名無しさん [2010/02/23(火) 05:41:33 ] 禿本の邦訳にも係わってる人だよ
322 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 12:14:03 ] えぴなんとかさんってすごいのかどうかよくわからん 昔の掲示板ログとか見るととんちんかんな感じだよね えぴなんとかさんが初心者だったころなのかもしれないけど
323 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:19:02 ] これのことかな episteme.wankuma.com/stlprog/index.html
324 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:48:30 ] わんくま同盟ってなんか気持ち悪いよね 公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ
325 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:14:15 ] 気持ち悪いというあいまいで感覚的な概念が気持ち悪い
326 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:41:10 ] 単に偉そうでむかつくんだろ
327 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:47:58 ] 「気持ち悪い」のはともかく、「よね」が意味わからん
328 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 20:52:33 ] 内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない
329 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:19:05 ] えぴなんとかさんって インなんとかさんみたいなもんか?
330 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:42:06 ] ペンネームに機種依存文字を使うプログラマの人って…
331 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:50:37 ] ビル☆ゲイツの悪口はそこまでだ
332 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:07:23 ] C++学ぶのにいい本ありませんか?
333 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:08:02 ] >>332 >>4-5
334 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:11:44 ] >>330 今チェックしたんだけど 機種依存文字じゃなかったぞ
335 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 06:51:15 ] >>332 こいつはマルチポストだから相手にしないように!
336 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:30:19 ] 単項演算子-のオーバーロードについて質問があります。 独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略) class coord{ int x,y; public: coord(){x=0;y=0;} coord operator-(coord ob2);//2項負符号 coord operator-();//単項負符号 }; //単項-をcoordクラスに対してオーバーロードする coord coord::operator-(){ x=-x; y=-y; return *this; } 上記の場合、 coord ob1; coord ob2; ob2=-ob1; としただけで、ob1の内容が変わってしまうと思うのですが、 このサンプルコードは正しいのでしょうか? 以下のほうがいいと思うのですが。 //単項-をcoordクラスに対してオーバーロードする coord coord::operator-() { coord temp; temp.x=-x; temp.y=-y; return temp; }
337 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:33:57 ] 俺もそのほうが良いと思う 一般に組み込み型と同じ挙動になるようにデザインするほうが良いと EffectiveC++にも書いてあるし
338 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:40:12 ] そしてconstを付けるべき
339 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 19:21:48 ] >>336 君の意見は正しい。 coord coord::operator-()const; とすれば納得できると思う。
340 名前:336 mailto:sage [2010/02/24(水) 19:57:51 ] >337-339 ありがとうございました。 これで先に進めます。
341 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:20:04 ] ん *thisを返すからいいんじゃないの?
342 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:23:33 ] this->xが変わるからダメなんじゃないの
343 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:28:54 ] プログラムに致命的なエラーがあり (取り扱えない例外をキャッチしたなど。) そこで即座に終了したい場合、 assert(0); exit(1); のどちらが望ましいのでしょうか? また、この2つにはどんな違いがあるのでしょうか? よろしくお願い申し上げます。
344 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:33:31 ] >>342 ああ、すまない。ぼけてたorz もう寝る…
345 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:42:17 ] >>343 assertは、ここでこうなってるはずがない、というプログラマの意思表示 んで、それはリリースビルドだとなくなるロジック
346 名前:デフォルトの名無しさん [2010/02/24(水) 23:59:19 ] インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。 一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、 いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。 また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。 つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか? (妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)
347 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 00:22:00 ] 一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ
348 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:11:41 ] >>343 その用途だと abort() あるいは terminate() が正解だと思う。 assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。
349 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:14:23 ] >>346 new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね? そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ 置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。
350 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:16:15 ] >>346 dlmallocなんて単純だからすぐ作れるし 自分でmalloc作ればいいよ
351 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:20:56 ] >>346 まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、 それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、 書いても良い。 それ以外は許さん。
352 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:51:00 ] >346 実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら? 実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。 お手軽に実装するんだったらboost::shared_ptr + deleterかね。
353 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:01:58 ] >>343 assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。 exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。 C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。 terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、 そこまでしたい状況は考えにくい。 結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが 常道だと思う。
354 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:05:19 ] >>343 取り扱えない例外ははじめからキャッチするなよ。 万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。 そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。
355 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:30:24 ] enum型を引数に持つときって参照渡しにした方がいいの? 構造体とは違うっぽいのでしなくてもいい?速度的に
356 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:38:12 ] >>355 速度が気になるなら計測してみるがいい。 参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより 大きくなることはなさそうで、あまりメリットはなさそうな感じではある。
357 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:54:59 ] >>351 配置newって嫌われ者なの?
358 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 05:48:41 ] >>355 列挙型の実態が整数"ではない”実装を見たことがない。
359 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 09:35:37 ] >>357 別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。
360 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:53:34 ] 誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。
361 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:55:15 ] >>360 boost::aligned_storage あたりでおきかえる。
362 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 11:33:04 ] じゃあ最初からboost::aligned_storageって書けよ
363 名前:349 mailto:sage [2010/02/25(木) 12:07:15 ] >>362 boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、 そんな気持ちを込めて「〜みたいな領域」と書きました。