- 1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
- 577 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:05:50 ]
- >>572
>データと手続きが別個だとプログラムの規模が上がった時に >一人で扱える限度を超えて手に負えなくなるんですよ なるほどー >.NETはC++/CLIという全く別個の言語ですので混同しないように >他にC#とかVB.NETなどもある あさってな質問ですいませんorz GUIのあるアプリケーション作ろうとするなら開発環境のスレに移るべきでしょうか? >>573 >自然かどうかはちょっと微妙なところがあるとおもうけど、 >自分や他人の作った複数のクラスが >うまく組み合わさって動くその様は、まさに壮観。 多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか? 呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。
- 578 名前:574 mailto:sage [2009/08/13(木) 23:06:11 ]
- >>575
>>576 ありがとうございます。 const unsigned int num = 10; const unsigned int hoge = 3 + 4; const unsigned int piyo = (3 + 4 - 1) * 2 / 3; char a[10], b[num], c[hoge], d[piyo]; がg++で通ることは確認しました。
- 579 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:06:44 ]
- >>554
よく理解できないがすげー参考になったわ
- 580 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:08:12 ]
- >>577
GUIの話題ならコンパイラスレに行った方がいいな >呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。 それは仕様書の話だね OOPとは関係ない
- 581 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:08:48 ]
- >>577
>多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか? いい表現だね。 まあ工夫の一つってことだけど。 クラスはテンプレートと組み合わせたときもまたすごいことになる。 例えば君が有理数クラスを作ったとして普通に使うとintが分母分子の型になるけど、 誰かが多倍長整数クラスを作ってくれていればそれを使うことで 多倍長桁数で分母分子を管理する有理数クラスが一瞬で出来る。
- 582 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:12:42 ]
- そうだなクラスの目玉機能の一つとして演算子の多重定義というのがあるな
これをテンプレートと組み合わせるとtraitsになる
- 583 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:18:08 ]
- >>580
了解しました。コンパイラスレ探しに行ってきます。 初心者の的はずれな質問に付き合って頂いてありがとうございます。 >>581 難しいですねw 理解するにはまだまだ勉強が必要みたいです。 大は小を兼ねる的な、 基本的な関数を、継承使ってちょっとカスタマイズすることで、 ゼロから書くよりは大幅に工数を削減して欲しい関数を実現する見たいな?
- 584 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:20:05 ]
- 大規模開発ではクラスは使わない
クラスと言う名の構造体しか使わない
- 585 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:22:12 ]
- >>583
実際は仮想関数を使うために仕方なくpublic継承を使うけど できることならコンポジションで対応出来る所はそうしたい 継承は使いすぎるとプログラムの見通しが悪くなるんですよ 実際にプログラム書いてみるとわかるけど それからUML図にも慣れるといいね UML無しにOOPしようとすると頭が爆発します templateは継承とはまた全然別の機能 ジェネリック・プログラミングのための機能でこれがあるために C++は特別な言語になっちゃってます
- 586 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:29:26 ]
- >>585
ありがとうございます。 実のところ、 UMLライクなお絵かきするとCコードを生成してくれる環境に慣れすぎてて、 裏で何が起きてるのかさっぱ分からないという状況に慌てて、 連休利用してCの文法見直してたらいつの間にかここに辿り着いたといった次第です。 (作って覚えるVC#とかの本でキーボード叩くのえらい難儀しました。) 継承とtemplateの違いがまださっぱりなので、 明日もじっくり解説サイト読んで来ることにします。 レスくれた人ありがとうございます。&おやすみなさいー
- 587 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 10:50:36 ]
- 一応Cは理解していると思っているのですが
C++を最初から勉強しようとした時、何かオススメの書籍なりサイトはありますか? 猫とかやさしい〜ってのはやめとけみたいな話を「C言語なら俺に聞け」というスレで目にしたもので
- 588 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:03:33 ]
- >>587
ロベールのC++を読んでおけ 規格書に近い内容まで知りたいなら詳説C++も読め
- 589 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:12:34 ]
- ロベール=ピエール
- 590 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:26:36 ]
- >>587
AcceralatedC++一択じゃないか? それはいいけど、折角書籍スレがあるんだから見てきたら?
- 591 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:34:09 ]
- >>590
C++を「一から」理解したい人に「AcceralatedC++」は 違うだろうと思うんだけど それよりC++ in-depth seriesそのものが違うだろうと思う あれは中級者が上級者に進むためのシリーズだろう
- 592 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:31:06 ]
- >>587
猫はそこまでは悪くないよ。 ロベールのC++教室 ttp://www7b.biglobe.ne.jp/~robe/cpphtml/index.html ここはお薦め。 ここと猫は併用して学んで欲しい。 入門者ならエクスメディアの『ビジュアルラーニングC++』って本が 個人的なオススメだったけど、会社が倒産した。
- 593 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 14:09:29 ]
- Webサイトの方のロベールはだめだ。いろいろ古い。
推奨されないコーディングもある。 本はそういうところ直されてるから、そっちを読んだほうがいい。
- 594 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:27:14 ]
- gotoって処理自体は軽いでしょうか?
gotoを使うと無駄なコンストラクタを一回さけられる状況なんですが。
- 595 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:34:11 ]
- そのコンストラクタを避けるのは本当に必要なことか?
何か速度的に重要な場面? gotoは、ローカル変数のデストラクタを呼ばなきゃいけなかったり tryブロックの出入りが必要な場合を除けば、軽い
- 596 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:51:40 ]
- goto使うなんて言ったら最後、
何回レビューして注意書き何箇所に追記せにゃならんか・・・ って状況でもなければ作って走らせて比較してみては?
- 597 名前:594 mailto:sage [2009/08/14(金) 21:05:25 ]
- >>595
> そのコンストラクタを避けるのは本当に必要なことか? そのコンストラクタはhoge_t型をテンプレート引数にもつクラステンプレートの ものであるため、hoge_t次第で重さが変わります。 > 何か速度的に重要な場面? 速度はあまり重要ではありません。 >>596 gotoを使ってあると、 「こいつ(の技術や作ったクラステンプレートは)大丈夫か?」 って思われますかね、やっぱ。
- 598 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:10:01 ]
- 使う理由とドキュメンテーションがしっかりしてればいいんじゃね
- 599 名前:594 mailto:sage [2009/08/14(金) 21:19:45 ]
- びびってきたんで止めときます。
こうして一生gotoを使わないまま過ごしそうです。
- 600 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:23:24 ]
- テンプレートの初心者です。
次のキューを実装するコード kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9901.txt でデータの型についてテンプレート化しようとして kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9902.txt とすると、上記ファイルの末尾にあるようなエラーが発生します。 これは、テンプレート関係の記述をどのようにすればいいのでしょうか。 理由あって、仮想関数を仕様しています。(スタックも実装する予定なのです。) もしよろしければ見てやってください。よろしくお願いいたします。
- 601 名前:600 mailto:sage [2009/08/14(金) 21:31:02 ]
- エラーの表示を忘れておりました。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9903.txt なにとぞお願いいたします。
- 602 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:34:57 ]
- class queue { 〜 } の中に using DataStruct<T>::buff; と書く
- 603 名前:600 mailto:sage [2009/08/14(金) 21:40:38 ]
- ありがとうございました。
テンプレートについて詳しく書かれた教科書を探さなければ。
- 604 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:41:26 ]
- >>597
MISRA-Cなんかだと例外処理の時のみ認められてるかな? gotoその物は悪くないんだ、ただ下手な使い手が多かっただけで、 このあたりはアメリカの銃問題と似たような感じ、 銃が悪いのか銃を使った人間が悪いのか、 銃が悪いのか、子供の手の届くところに銃を放置した親が悪いのか、ってな感じでね。 そのgoto使う箇所ってどのくらいの頻度で呼ばれるの? CPUもメモリも豊かな時代だからよほどのことがない限り使わないけど。
- 605 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:44:41 ]
- >>597
よく読んでなかったスマソ 実行速度はもちろん、コードの可読性が上がるみたいな理由がなければ、 基本的に使わないのが無難かな、 イスラム教徒とか黒人だってだけで差別されるっしょ? あんな感じよ。
- 606 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 22:19:34 ]
- そこまでの差別意識はないけど、ここ十数年gotoは使ったことない。
使う理由が見出せないだけだがな。もしgoto使った人間が近くにいたら、 理由を聞いて見たい、いや問い詰めたい気分がするのは間違いない。
- 607 名前:597 mailto:sage [2009/08/14(金) 22:48:52 ]
- >>604
呼ばれる頻度はたいしたこと無いと思います。 >>605 可読性はむしろ下がると思います。 >>606 ですよね、自分も他の人間が使っていたら是非聞いてみたいと思います。 やはり使わないのが無難という感じでしょうか。。。
- 608 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 22:57:04 ]
- 俺はそれほど気にしない派
しかし可読性が下がるのは戴けない 速度がよほど気になる場合以外は、可読性を取るべき
- 609 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 23:02:02 ]
- 末尾再帰したいけど最適化が保証されないからgoto使ったことあったかも
- 610 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 00:32:54 ]
- gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・
- 611 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 03:07:19 ]
- 条件演算子で避けられたりしないか?
- 612 名前:597 mailto:sage [2009/08/15(土) 08:12:23 ]
- ありがとうございます。
> gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・ 既に作ってあるオブジェクトを返せばいいっていう状況です。 ちょっとここのあたり(もしgotoを使ったら)スパゲティプログラムに突入します。 > 条件演算子で避けられたりしないか? さけがたいです。
- 613 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 09:10:29 ]
- >>612
ifとauto_ptrで回避できると思うんだがどうよ もっとも、実行速度にあまり影響ないなら分岐を避けたほうがいいかもね
- 614 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 11:44:18 ]
- VC++6.0をもってるんだけど、これで勉強すればいいのかなぁ?7.0とかあるの?
- 615 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 11:48:38 ]
- VC6は窓から捨てるべき
2008のExpressを使いなさい
- 616 名前:612 mailto:sage [2009/08/15(土) 12:51:19 ]
- >>613
newして得たオブジェクトでしたらauto_ptrを使うことも考えますが、そうではないのでこのまま分岐を避けようと思います。 >>614 VC6で勉強するのは、今現在は相当悪い選択肢だと思いますよ。 VC8かgccがオススメです。
- 617 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 12:56:27 ]
- >>614
特別な理由がなければ、VC++6.0より下記の製品のどれかの方が断然いいよ。全部タダだし。 Microsoft Visual Studio 2008 Express Edition www.microsoft.com/japan/msdn/vstudio/express/
- 618 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 13:06:23 ]
- >>617
dクス
- 619 名前:デフォルトの名無しさん [2009/08/15(土) 13:15:06 ]
- VC6は現行の標準C++じゃないと思ったほうがいい。
C++ライクなVC6独自言語だと思いましょう。
- 620 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 13:40:27 ]
- >>619
kwsk
- 621 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:02:26 ]
- コンストラクタで配列の要素数を自動で取得したいのですが...
TCHAR a[] = _T("123"); my_array<TCHAR> v = a; 見たいなことをやりたい 理想は、 my_array<TCHAR> v = _T("123"); だけどこっちはまあいいや
- 622 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:42:39 ]
- my_arrayが何かわからないけどこういうこと?
std::basic_string<TCHAR> v = _T("123");
- 623 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:45:04 ]
- こうですねわかります
template<typename T> struct my_array { template<std::size_t L> my_array(T (&a)[L]) { std::cout << "length: " << L << std::endl; } template<std::size_t L> my_array(T const (&a)[L]) { std::cout << "length: " << L << std::endl; } }; int main() { my_array<TCHAR> v = _T("123"); }
- 624 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:48:17 ]
- 次のコードをコンパイルすると、リンカがエラーを吐きます。
codepad.org/Lrswof7O 何処が悪いのでしょうか?
- 625 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:58:01 ]
- 変数の実体がない。
myclassスコープ外で int myclass::i=0;
- 626 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:59:28 ]
- >>622
ごめんクラスを作りたかったんだ >>623 おーすげーまさにそれです C++は奥が深い
- 627 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 17:24:21 ]
- >>624
実体を定義しろ。 C++ code - 23 lines - codepad ttp://codepad.org/XPEjNpOy これが正解。
- 628 名前:624 mailto:sage [2009/08/15(土) 19:38:06 ]
- >>625, >>627
ありがとうございます。そういうことなんですね。 これからもちょくちょくこのような初心の質問にあがると思いますが、どうかよろしくお願いいたします。
- 629 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:13:54 ]
- C++で、
誤差のない小数計算(実数計算)が出来るライブラリは ありませんか? Boostにはなさそうで。
- 630 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:30:11 ]
- どんな計算をしたいのか?
- 631 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:45:45 ]
- 三角関数です。
誤差のない小数計算型 x; sin(x)+cos(x) とかです。
- 632 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:48:26 ]
- その計算結果をどのような形で受け取りたいの?
- 633 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:50:58 ]
- >>629
有限ビットで誤差が無いなんて可能なんですかね? 僕も知りたいです。
- 634 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:55:51 ]
- >>633
有理数ならboost::rationalで表現できる。
- 635 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 09:02:25 ]
- RealLibでも使えば?
- 636 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 11:02:56 ]
- 三角関数は一部の結果を除いて無理数でしょ。
- 637 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 11:39:52 ]
- >>635
RealLibは遅延評価で計算してるのかな?
- 638 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:23:49 ]
- >>634
三角関数といっているではないか。
- 639 名前:629 mailto:sage [2009/08/16(日) 12:33:08 ]
- >>632
同じ型の変数で受け取りたいです >>635 ありがとうございます。 スレがあるんですね。 ttp://pc12.2ch.net/test/read.cgi/tech/1248060999/ このスレの>>8さんの発言 「こんなの使わなくたってVW使えばふんがっふんぐっ」 の、VWって何でしょうか? そういうライブラリがあるのでしょうか?
- 640 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:46:20 ]
- 710 名前:□7×7=4□□[sage] 投稿日:2009/07/29(水) 19:17:00 ID:X3ZTVshE
[タイトル] Cargo Bridge [タイプ] 橋かけ・構造力学パズル [URL] www.limexgames.com/ [感想] bridge builderとかやったことある人ならわかりやすいとおもう。 キャラクタが荷物を押して倉庫まで運ぶために、途中の谷に橋をかけるゲーム。 パーツは4種類あり、足場になるパーツと足場にならず支えにだけなるパーツ、それぞれが木製と鉄製の2種類ずつ。 足場になるものの方が高価で、鉄製の方が高価。はじめは木製の2種類だけが使える。 使用できるパーツは右上の予算範囲内に抑えなければならない。安上がりでできるほど高得点。 橋にかかる負荷が、キャラクタが運ぶ荷物の種類によっても大きく変化したり、片道でいいところと往復するところがあったり、 いろいろ考える要素の多いゲーム。今16面挑戦中。 キャラクタが谷に落ちていくときの声がシュールw こういうゲームがあるんだけど、参考ソースとかってどっかにないかな・・・
- 641 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:50:14 ]
- linear programmingでwikipedia.enれ
- 642 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:13:29 ]
- >>641
それは計算機にゲームを解かせる場合の方法論であって、ゲームの作り方の ガイドにはならんだろ。
- 643 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:26:01 ]
- >>639
最終的に計算結果として数値が欲しいのでは?
- 644 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:27:18 ]
- >>640
デザインパターンのどれかに当てはまりそうだけどちょっと思いつかないわ。
- 645 名前:639 [2009/08/16(日) 13:35:21 ]
- >>643
最終的には文字列表記で計算結果が欲しいです。
- 646 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:38:44 ]
- >>640
こういうゲーム大好きだw 参考ソースは思い浮かばないけど、 高校物理の力学をシミュレートしてるだけに過ぎないのでは?
- 647 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:00:32 ]
- >>646
数理計画法(シンプレックス法)では?
- 648 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:12:22 ]
- FEMだろ
- 649 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:14:17 ]
- >>648
有限要素法ではないと思う。別に力学的解析が必要なわけではないし。
- 650 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:20:28 ]
- >>648
それだ!
- 651 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:32:00 ]
- 具体的に何桁の精度が必要なのか明示しないと無理なんじゃない?
浮動小数点とかの概念も知らなさそうだし。
- 652 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:36:39 ]
- ∧_∧ / ̄ ̄ ̄ ̄ ̄
( ‘∀‘)< オマエガナー ( ) \_____ | | | (__)_)
- 653 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:39:13 ]
- >>640
コードは知らないが、ニュートン力学で十分シミュレートできるだろうね。 パラメータの調整が面倒だと思うが。 >>647 既に上で言及されている。linear programming = 線形計画法。 シンプレックス方は線形計画法の解き方の一つ。
- 654 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:48:58 ]
- 線形計画法は関係ないな
- 655 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:53:36 ]
- くみ上げるのはユーザーなんだから、
最適解の算出とか不要でしょ
- 656 名前:642 mailto:sage [2009/08/16(日) 15:22:35 ]
- だから関係ないって言っているんだが。
- 657 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:32:42 ]
- >>645
文字列って、数式の文字列?だったらmathmaticaを使えばいいんじゃないかな。
- 658 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:40:48 ]
- >>657
ライブラリを求めてるんだろ。 お前ライブラリの意味分かってる?
- 659 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:55:36 ]
- 数式処理ライブラリがあるなら教えて
- 660 名前:658 mailto:sage [2009/08/16(日) 17:19:14 ]
- >>659
しらね。 自分で探せよ。
- 661 名前:639 mailto:sage [2009/08/16(日) 17:30:05 ]
- >>657
いえ、ただ出力するときに std::cout << static_cast<double>(計算結果) などいうバカなことはしないってことです。 ようするに出力時には精度指定で std::stringもしくはconst char* const型 で結果が得られると良いのですが。
- 662 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:49:04 ]
- >>691
最終的に有限の精度で返すなら誤差は存在することになりますね。 従って計算は、最終的に必要な精度が得られる有限の精度で(誤差のある)計算をすればよいことになります。
- 663 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:52:37 ]
- >>662
ttp://gmplib.org でも使っとけ
- 664 名前:639 mailto:sage [2009/08/16(日) 18:19:31 ]
- >>662
そうでも無いのです。 例えば sin(acos(-1)) などです。
- 665 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:24:51 ]
- だから数式処理システム使えよ
- 666 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:36:18 ]
- >>665
ライブラリが欲しいのです。 数式処理システムだと使い物になりません。 あと、数式には文字式はありません。
- 667 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 19:37:37 ]
- >>644
>>646 >>653 dクス あぁ〜作ってみてぇ シンプレックス法か
- 668 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 19:54:08 ]
- >>664
結果が0にならないね。有限の精度ならそうなるし、数値演算ではよくある話になる。 その辺はいろいろテクニックを使うんだ。たとえばsqrt(1.0-x*x)を使うとか。 数値演算の誤差について調べたほうがいい。
- 669 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:32:39 ]
- そんなことは知った上で聞いてると思うが
- 670 名前:639 mailto:sage [2009/08/16(日) 20:41:50 ]
- 皆さんありがとうございました
紹介されたRealLibのスレのリンク先などを見て挑戦してみます。
- 671 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:12:10 ]
- >>666
バックエンドで数式処理システム動かしておいて そいつと通信するライブラリを自作したら? いまいち何がやりたいのか伝わってこないんだけど
- 672 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:13:44 ]
- >>671
お前は何でそこまでライブラリを嫌うんだ? > バックエンドで数式処理システム動かしておいて > そいつと通信するライブラリを自作したら? まじめに言ってるの? 開発したことある?
- 673 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:32:07 ]
- 俺ライブラリのブラのあたりが嫌いだわ。 なんかブラブラ揺れてそうで。
- 674 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:35:08 ]
- >>667
シンプレックス法は関係ないってw
- 675 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:54:25 ]
- >>672
なぜ俺に食いつく? この件に関しては初カキコなんだが 少し落ち着け
- 676 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 07:50:28 ]
- もう本人いねーんじゃね。
- 677 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:40:50 ]
- int型の変数hogeにビット演算を施したいのですが、
ビット演算は環境依存になってしまったりしますか? 2で除算したりするときはビット演算のが速いのではないかと思いまして。 (それともコンパイラの最適化があれば変わらないのでしょうか。)
- 678 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:44:04 ]
- >>677
そんな判断ができないくらいなら、素直に2で割っておけ。 速度比較結果自体は最近見掛けたが、結論は出てないと思うぞ。
- 679 名前:677 mailto:sage [2009/08/17(月) 10:46:58 ]
- >>678
レスありがとうございます。 ビット演算は実はやったことがないので、 もし速いのならこの機会に勉強してみようかなと思いまして。 でもint型なので負の数が混ざると複雑になりますかね。
- 680 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:52:45 ]
- 速さについての云々は、
まず実測してみたらってのがいつもの結論じゃね。
- 681 名前:677 mailto:sage [2009/08/17(月) 10:56:18 ]
- >>680
やっぱ実測なんでしょうか? まあビット演算は腰が重いので、速さを追求する時までは止めておきます。 ありがとうございました。
- 682 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:58:39 ]
- VC++2008にて
const int b = 2; c = a / b; このソースが sar eax, 1になる件。 素人が思ってる以上にコンパイラはうまいことやってくれるよ。
- 683 名前:677 mailto:sage [2009/08/17(月) 11:01:26 ]
- >>682
私よりコンパイラの方が頭が良さそうなので コンパイラの最適化に頼る事とします。
- 684 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:08:46 ]
- >>682
正確には cdq sub eax,edx sar eax, 1 だな。 でないと負の数で端数を切り下げてしまう。
- 685 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:13:31 ]
- アセンブラって全然分からないんですが
勉強しなきゃダメですかね。。。
- 686 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:35:35 ]
- >>685
必要になるまでしなくていいと思うよ。 少なくとも、ビット演算がどうのこうのと言うよりも後でいいし、 そもそも他にやるべきことは幾らでもある。
- 687 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:42:54 ]
- class base
class a : public base class b: public base func(base *pb){ if(typeid(pb) == typeid(a*){ aアクセス用のポインタ作成 }else{ bアクセス用のポインタ作成 } オーライドされたそれぞれの関数にアクセス } ってことがやりたんだけどポインタ作成の部分がわかりません こういう場合って同じ処理をif文の中に2回書かないと出来ないの?
- 688 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:45:39 ]
- >>687
C++の初歩を勉強してください。 そうすれば、pb->func()で事が足りるかどうか判断できるでしょう。
- 689 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:49:05 ]
- base の関数をvirtualにしたら出来た
- 690 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:18:00 ]
-
#undefしていようがいまいが 別のソースで同名のマクロがあったらどうしようも無いわけですので、 #undefすることの意義がいまいち分かりません。 #undefは心がけた方が良いのでしょうか?
- 691 名前:690 mailto:sage [2009/08/18(火) 18:28:15 ]
- ×別のソースで
○別のヘッダーで
- 692 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:41:04 ]
- おまえはまだC++でマクロを使いたいのか。
- 693 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:55:01 ]
- はい。
- 694 名前:690 mailto:sage [2009/08/18(火) 19:13:22 ]
- >>692
「マクロって超便利!」 →「inline関数ってすげー! templateもすげー!」 →「やっぱりマクロにしか出来ないこともあるじゃん。両立が大事だよな。」 今の私はこの心境なんです。 例えば似たような演算子を一斉に定義するときなど、 #define MACRO(..., op,...) のようにしてopに演算子を入れたりとか まあ色々使い道はあるじゃないですか。
- 695 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:16:37 ]
- それはない。
- 696 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:18:52 ]
- ほとんど重複してるけどちょっと違うコードとかマクロ使っちゃうよね
- 697 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:23:13 ]
- 確かにね。MFCやATLのメッセージマップなんかはマクロの恩恵なしには実現し得ないしね。
Effective C++でもまだまだ必要な部分もあると認めてはいる。 でもやっぱり危険だから、なるべく使わないに越したことはない。でも使いたい? なら、他人のプログラム領域に踏み込まないように最大限の注意を払うべきだ。 自分の管理していないようなヘッダーに自作ヘボうんこマクロを混入させてしまうようなまねは厳に慎むべきで 自分の書くマクロは1翻訳単位内に限定し、ヘッダに宣言するような真似はやめにして もしヘッダに書くなら必ず末尾で#undefして、あるいはヘッダの冒頭に 「このヘッダファイルは俺専用だからお前のプロジェクトでインクルードするなよ?絶対するなよ?」 と注意書きをしておくべき。 なんだったらヘッダファイル作らないというのも手だ。 俺の書いた関数が使いたい奴は手書きで宣言しろ、と。
- 698 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:25:14 ]
- >>696
関数化するか、テンプレートを使うか、データ構造を見直せば、そんな気持ちの悪いことはしなくて済むと思う。
- 699 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:28:31 ]
- C++2003でvariadic templateをやろうとしたらプリプロセッサ使ってパラメタ変えながら
再帰#includeとかする必要もありますしね
- 700 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:50:20 ]
- 再帰リスト作ればいいじゃん
- 701 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:51:06 ]
- 嫌だね
- 702 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:52:52 ]
- まともなライブラリ(Boostとか)のコードを
お読みになれば、結構使われていることも ご理解いただけると思いますよ。 コンパイラ毎にコードをかえるためとかそれだけのため だけではありません。
- 703 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:00:01 ]
- 話し中すみません。
boost\date_time\int_adapter.hpp 等で (::std::numeric_limits<int_type>::max)(); と書かれているのですが、これはどうしてこの様な記法になっているのでしょうか?
- 704 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:00:44 ]
- より高級な機能がないから仕方なく使われてる、って以外に
マクロが重要になるケースって何かあるの?
- 705 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:04:07 ]
- >>704
基本的には「仕方なく」使われていますよね。 仕方なくじゃない使い方としては Boost.Preprocessor に代表されるプリプロセッサメタプログラミングがあるのではないでしょうか?
- 706 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:37:14 ]
- >>703
Boost本家スレで 773 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 20:59:38 BOOST_PREVENT_MACRO_SUBSTITUTION っていうマクロはどういった用途で使う(or使われている)のでしょうか? そもそも定義されている部分すら見つけられません。。。 774 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:14:07 boost/config/suffix.hpp にあるよ 775 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:15:44 >>773 prefix.hppで定義されてる 使い方は,たとえば某MSのヘッダファイルのように #define min(a,b) ... #define max(a,b) ... と定義されてあった場合, std::min(lhs, rhs) や std::max(lhs, rhs) や std::numeric::limits<hoge>::max() などの min, max がマクロで置換されてしまうけど, std::min BOOST_PREVENT_MACRO_SUBSTITUTION (lhs, rhs) と呼び出せばこれを防げる. つっても,冗長すぎるから普通は(std::min)(lhs, rhs)ってやるけどNE 776 名前:773 [sage] 投稿日:2009/07/28(火) 22:25:46 ありがとうございます。 理解出来ました! てな会話が行われていたよ。
- 707 名前:703 mailto:sage [2009/08/18(火) 20:44:37 ]
- >>706
ありがとうございます。 そうしますと、私がこれから定義するmaxテンプレートなども 全て(max)にした方が望ましいと言うことですよね。 ありがとうございました。
- 708 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:10:40 ]
- >>531
www.boostpro.com/vault/index.php?&direction=0&order=&directory=Function%20Objects ここのc_functionってのがおもしろい。 関数オブジェクトを関数へのポインタに変換してしまう代物。 ググれば日本語での解説も少しは見付かると思う。
- 709 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:29:32 ]
- #include <vecter>
とやっているのですがerrorC1083が出てしまいます VC++2008EEを仕様しています。 ちなみに#include <list.とかはエラーを出しません
- 710 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:33:03 ]
- ごめんなさいvectorでした・・・
- 711 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:35:48 ]
- (´ー`)
- 712 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 22:14:51 ]
- ウヒヒ
- 713 名前:デフォルトの名無しさん [2009/08/20(木) 00:40:25 ]
- このスレ過疎ってるな。
- 714 名前:713 mailto:sage [2009/08/20(木) 00:43:37 ]
- いや過疎ってなかったか。
見間違えた、
- 715 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:44:10 ]
- 過疎ってねーだろ
- 716 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:49:12 ]
- int foo(double val)
{ if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } こんな関数があります。 この処理の部分で、valの値によってはfooを再帰呼び出ししたいことがあります。 その場合に単に普通に再帰呼び出しをしてもいいのですが、 再帰呼び出しでは無駄な処理(引数の範囲エラーチェックなど)を飛ばせるように フラグ変数をboolで引数に持たせる事はしても問題ありませんか?
- 717 名前:716 mailto:sage [2009/08/20(木) 00:51:58 ]
- つまり
int foo(double val, bool recursive_call = false) { if( !recursive_call && val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } として、再帰時はfoo(val, true)とすることで無駄な処理を飛ばせるようにするのは 設計上まずいとかありますでしょうか?
- 718 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:58:16 ]
- liboctaveについて質問なのですが
Matrix型などで各要素でlong double型を扱うことはできますか? 標準だとdouble型になってしまうのですが・・・ できればやり方も教えていただけるとうれしいです
- 719 名前:718 mailto:sage [2009/08/20(木) 01:01:39 ]
- すいません
octaveのスレがあるようなのでそちらで聞くことにします それでは失礼します
- 720 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:10:34 ]
- >>717
無駄を飛ばすと言って無駄なフラグを足すのがアホっぽい。
- 721 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:15:38 ]
- int foo(double val)
{ /*無駄な処理(引数の範囲エラーチェックなど)*/ foo_r(val); } int foo_r(double val) { if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 foo_r(val); }
- 722 名前:716 mailto:sage [2009/08/20(木) 01:19:16 ]
- >>720
処理の無駄は実行時間の無駄ですが フラグ引数はコンパイル時間の無駄なわけですので 必ずしもおかしなことでは無いと思っております。 どうすればよろしいでしょうか? >>721 確かに処理を分けるのがよさそうですね。 ありがとうございます。
- 723 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:24:50 ]
- それ以前に重い処理を再帰すんな
設計を見直せ
- 724 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:27:01 ]
- >>722
> 処理の無駄は実行時間の無駄ですが > フラグ引数はコンパイル時間の無駄なわけですので 何を根拠にそんなこと言ってんの? 余計な引数があれば実行時間も食うしスタック消費量も増える。
- 725 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:27:45 ]
- 「増える」は言い過ぎた。
「増えてもおかしくない」だな。
- 726 名前:722 mailto:sage [2009/08/20(木) 01:56:45 ]
- >>723
再帰と言えば再帰ですが、最大で2回までの再帰でして これ以上軽量化は厳しい状況です。 >>725 > 処理の無駄は実行時間の無駄ですが > フラグ引数はコンパイル時間の無駄なわけですので は主として困る弊害をあげたものです。 bool引数が一つ増えたところで if( val == 0.0 /*その他重い判定処理*/ ) assert(false); を上回るほど実行時間は食いませんしスタック消費量も増えないと 思うのですが。 というか確定的だと。
- 727 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 07:50:58 ]
- >>726
最大2回までの再帰ってのがすでに何かおかしい気がする 関数の役割や関係を見なおしてみたら?
- 728 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:09:32 ]
- >>726
そんなに判定が重いなら、判定部分とその後の処理部分を別の関数に 分ければいいだろう。 そういう風に分けたら、結局再帰なんて必要なくなると思うが。
- 729 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:30:46 ]
- >>726
>> 処理の無駄は実行時間の無駄ですが >> フラグ引数はコンパイル時間の無駄なわけですので >は主として困る弊害をあげたものです。 引数にフラグを追加すると、コンパイル時間の無駄が「主として困る弊害」になるの? すごいコンパイラを使ってるんだなぁ。
- 730 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 09:25:33 ]
- 本当にその無駄が処理のボトルネックになってるならそういう書き換えをやるのもアリだろうが、
そうでなければ全く意味が無いぞ ちゃんとプロファイルとって調べたか?
- 731 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 09:29:58 ]
- compile time debugger
compile time profiler
- 732 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:12:13 ]
- class A{
int a; ... void func(){sizeof(*this);} }; class B : public A{}; Aの仮想関数func()内でsizeof(*this)したところ、サイズは128でした。 ところが、Bのfunc()での実行結果はクラスサイズが176なのに、Aと同じ128という結果でした。 Bのfunc()でも176というサイズを得るにはどのようにすれば良いでしょうか? B側でfunc()を定義し直せば解決するのですが、できればAのfunc()のみをいじって解決したいと思います。 環境はVC++2005です。
- 733 名前:732 mailto:sage [2009/08/20(木) 12:16:58 ]
- virtual void func(){sizeof(*this);}
でした。すみません。
- 734 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:19:43 ]
- >>731
TMPやってると欲しかったりする あるのかな
- 735 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:42:32 ]
- >>732
こんな感じの醜いコードを書くくらいしかできないと思う if (typeid(*this) == typeid(A)) { return sizeof(A); } else if (typeid(*this) == typeid(B)) { return sizeof(B); } else { throw std::runtime_error(); }
- 736 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:44:28 ]
- >>732
A の側では B の存在すら知らない状態だし、実行時型情報として sizeof を取り出す 標準的な方法も無いので、無理。
- 737 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 13:01:49 ]
- こういうのはだめ?
クラスBなどAの派生クラスにも、継承元をAからAImplBase<B>へと変更するという修正を加える必要があるけど。 #include <iostream> class A { char a[128]; public: virtual std::size_t this_size() {return sizeof (A);}; }; template<typename T> class AImplBase : public A { public: virtual std::size_t this_size() {return sizeof (T);}; }; class B : public AImplBase<B> { char b[128]; }; int main() { B b; std::cout << b.this_size() << std::endl; }
- 738 名前:732 mailto:sage [2009/08/20(木) 14:28:26 ]
- >735-737
回答ありがとうございます。 難しいようですね。勉強になりました。 >737さんの案を元にちょっと考えてみます。
- 739 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:06:11 ]
- MFC勉強してるんだけど動画の再生ってできるのかな?
フレーム取り出して一枚一枚ペイントしてくしかない?
- 740 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:12:59 ]
- >>739
Yes
- 741 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:13:07 ]
- >>739
DirectShowで再生するのが一般的かと DirectShowの質問は専用スレがあるからそっちでどうぞ
- 742 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 19:31:24 ]
- 動画再生するのが一番の目的じゃなくて
入力動画→処理→出力動画ってのを並べて同時再生とかできれば こんなに変わったんだよって分かりやすいかなと思ったんですよね とりあえずDirectShowについて少し調べてみますありがとうございます
- 743 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:34:53 ]
- きっと泥沼になる
- 744 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:39:45 ]
- 処理がリアルタイムじゃないならそんなに難しくないけど・・・
- 745 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 22:44:36 ]
- 配置のニュアンスとしては
入力動画1 入力動画2 合成動画 のように表示したいので MFC上で動画表示したいなと思ったのですが無理そうなら画像列で表示しようと思います
- 746 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 00:17:13 ]
- クラス設計に関しては割とましになってきたような気がするけど
クラス間の連携がどうもうまくいかない・・・ Mediatorとかためして見たんだけど、メディエータのメンバ関数が増えまくってしまう・・・
- 747 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 07:32:07 ]
- codepad.org/7lYft1tr
bad_weak_ptrが出ちゃう。誰か助けて。 ライブラリ側にBaseクラスがあって、何も変更できない。 やりたいことは、Derivedクラスのメンバ関数のファンクタを作りたい。 (コールバック用のファンクタがほしい) オブジェクトのライフタイムの関係上、 shared_from_this()の代わりにthisを渡したくない。 くそーわけわかめだぜ
- 748 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:00:30 ]
- >>747
enable_shared_from_this が2つあるからダメなんじゃないの? Base が変更できないなら Derived のほうは enable_shared_from_this つけなくて いいでしょ。
- 749 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:32:03 ]
- >>747こうすると、shared_ptrに捕まえられたファンクタがfに代入される。ただ、F()でF()のファンクタを作る意味がないけど。さらにfで保持すると参照カウンタが0にならなくなる。
ファンクタを作りたいなら、mainで bind(&Derived::F,d)とすればすむ筈。 #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/function.hpp> typedef boost::function< void () > func_t; class Base { public: void N(){}; }; class Derived :public Base, public boost::enable_shared_from_this< Derived > { public: void F() { f = boost::bind( &Derived::F, this->shared_from_this() ); }; func_t f; }; int main() { boost::shared_ptr< Derived > d( new Derived ); d->F(); func_t x=boost::bind(&Derived::F,d); return 0; }
- 750 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 20:11:27 ]
- >>748
>>749 レスさんすこ。 単純に、enable_shared_(ryだと、 BaseクラスにFメンバ関数がないから、コンパイルが通らないから、 Derivedでも継承させた。 今ぶち当たってる問題を単純なコードに落としただけだから、意味は考えないでくだしあw >さらにfで保持すると参照カウンタが0にならなくなる。 メンバに自分自身を持たせるとダメなの? よくわからん。確かにdtorが走ってなかった・・・
- 751 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 21:00:57 ]
- >>747
Baseのenable_sahred_from_thisを活用する、つまりダウンキャストはだめ? class Derived : public Base { public: void F() { f = boost::bind( invoke_f, shared_from_this() ); }; static void invoke_f(boost::shared_ptr<Base> b) { boost::shared_polymorphic_downcast<Derived>(b)->F(); } func_t f; }; invoke_fはlambdaやbindで実装できるなら不要。 Baseに仮想関数がないなら、shared_polymorphic_downcastの代わりにshared_static_castを使えばいい。 あと、お前の例でも通用するか分からないが、安直にweak_ptrを使えば当然デストラクタも呼ばれるようになる。 void F() { boost::weak_ptr<Base> wp = shared_from_this(); f = boost::bind( invoke_f, wp ); }; static void invoke_f(boost::weak_ptr<Base> b) { if (boost::shared_ptr<Base> sp = b.lock()) { boost::shared_static_cast<Derived>(sp)->F(); } }
- 752 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 21:40:42 ]
- >>750
fがDerivedをつかんでいる限りDerivedは開放されない。fがDeriviedを放すのはDerivedが開放されるときだから。 DerivedでFのファンクタを保持する必要性はほとんど無いと思われるので、その辺を検討しよう。
- 753 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 23:51:26 ]
- 質問があるのですが、
以下のソースのように、例外をいっさい投げれない関数内で例外を投げる処理を書いていまして、 プログラムが異常終了するのを期待しているのですが、VC++2008のコンパイラだと例外をキャッチしてしまいます。 これって理由ありますでしょうか? ちなみに他のコンパイラ(bcc32, g++)では期待通りに異常終了します。 #include <iostream> using namespace std; void test() throw() { throw 0; } int main() { try { test(); } catch(...) { cout << "test\n"; } return 0; }
- 754 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 01:11:25 ]
- >>753
VC++の仕様。VC++は基本的に例外指定を無視する。 throw()も最適化のヒントになるだけ。 msdn.microsoft.com/en-us/library/wfa0edys.aspx
- 755 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:01:59 ]
- C++ Coding Standards 第75項によると
「強制されない限り、自分の関数に例外仕様を書かないこと」と書いてありまっする。
- 756 名前:753 mailto:sage [2009/08/22(土) 06:07:01 ]
- >>754, 755
どうもありがとうございました! すっきりしました。
- 757 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 12:00:03 ]
- >>753
以前vc9(betaだったかも)でいろいろ試したときは throw()つきの関数内で例外を投げるコードをreleaseビルドしたバイナリを実行したときは異常終了したと思う 嘘だったらごめん
- 758 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:09:05 ]
- >>755
その理由は? その関数が投げる例外が正体不明になったら普通困らないかな?
- 759 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:48:54 ]
- >>758
まずコストとして、 try-catchブロックが挿入される でそれが最適化の妨害をする 違反した際はunexpected_handlerに飛ぶだけになって、 指定しなかった場合において得られる可能性のある例外の情報は失われる 得られるものは動的なチェックだけ、 それも例外仕様に違反したら精々「違反した」だけ言って落ちるだけの貧相なもの 備考として、 テンプレートが関わるとどんな例外が来るかは定義時点では決定不能なので 適切な例外のリストを作ることは無理 こういう性質のもので関数が投げる例外が明確になる? 使う価値あると思う?
- 760 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:29:34 ]
- それってthrow()も駄目なのか?
まぁ別に大抵は書く必要も無いけどなthrow()なんて
- 761 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:59:06 ]
- throw()だけは価値がある場合もあるかもしれない、俺は書かないけどね
と書いてある
- 762 名前:753 mailto:sage [2009/08/22(土) 16:17:01 ]
- >>757
IDEを起動してreleaseで実行したところ異常終了しました。 違いがよく分かりませんが、debugにすると例外をキャッチしました。
- 763 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:52:10 ]
- デフォルトだと例外仕様違反するとunexpected()->terminate()->abort()が呼ばれることになってるから
異常終了するのが正常
- 764 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:15:05 ]
- throw(hoge)って書いても関数仕様変更すると広域に波及して変更が大変。労力に見合ったメリットってない気がする。
ただthrow()は例外安全を示すメリットはあると思う。 そういえばデストラクタにthrow()はなんで書かないんだろうか?
- 765 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:29:39 ]
- アホなコンパイラがtryブロック挿入する可能性があるから
- 766 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:09:44 ]
- 例外投げない保証は有用なのにthrow()がクソすぎるから
C++0xでnoexceptというのを型システムに組み込もうぜという話がある
- 767 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:15:56 ]
- allocator とか auto_ptr とか vector<bool> とか
どんどんゴミがたまっていきますね^^
- 768 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:54:45 ]
- おまえallocatorとauto_ptrなめんなよ
- 769 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:07:24 ]
- まあauto_ptrはunique_ptrに移行してdeprecatedの予定ですけどね
- 770 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:12:35 ]
- だがゴミではない。現行の規格では重要なものだ。
- 771 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:22:29 ]
- 同情の余地がないvector<bool>さんパネェ
- 772 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:32:02 ]
- おまえら予約語なのにスルーされてるexportさんに謝れ
- 773 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:35:31 ]
- export は普通に関数名とかに使いたいときがあって困るな。
キーワードは変に短縮されてるほうがいいんじゃないかとすら思うよ。 int とか const とか、まず自分で使う気にはならん。
- 774 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:38:16 ]
- まともな実装がないexportを何故標準に入れたのか
標準化委員会は狂っているとしか思えない
- 775 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:39:05 ]
- Comeauなめんな
- 776 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 22:00:12 ]
- >>747
コールバックのための関数オブジェクトはこれ Derived オブジェクトの外に配るんですよね? コールバックのための関数オブジェクトをメンバとして保持せずに 外に配るときに毎回作る + shared_ptr<Base> を downcast したものを持たせる, で良いのでは?
- 777 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 23:56:22 ]
- >>774
>435-436 時々で良いから、Comeauの事を思い出してあげて下さい
- 778 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:15:02 ]
- >>766
確かに、constメンバ関数と同じように例外安全性の指定ができればいいなーと思ったことはある C++ Sourceにテンプレートを使って実現する技法が投稿されてたけど、 あれを実践するのは正直ムリだと思った
- 779 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:34:50 ]
- export の実装ってそんなに難しいかなあ。
オブジェクトファイルにソースコード埋め込んで、リンカからコンパイラ呼べば 済むと思うんだけど。
- 780 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:37:50 ]
- >>779
よく分からんがそのお前の案とやらで gccでexportが実装できたら このスレの神プログラマとして あがめられるな。 すくなくともテンプレには確実に入る。
- 781 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 01:14:34 ]
- Comeauが3人年かけてexport実装して「もうやだ実装したくない」って禿に泣きついた話が
D&Eに載ってるから読むがいい
- 782 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:07:50 ]
- その話に関してはどちらかというと Exceptional C++ Style を紹介したほうが良いような?
- 783 名前:デフォルトの名無しさん [2009/08/23(日) 03:08:52 ]
- boost::functionの型引数について教えてください。
boost::function<int (int)>と宣言したときに、 どうやってシグネチャから戻り値の型と引数の型を取り出しているのでしょうか?
- 784 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:11:35 ]
- template<typename T>
class function<T()>{/******/}; template<typename T, typename U> class function<T(U)>{/******/}; template<typename T, typename U, typename V> class function<T(U,V)>{/******/}; ; とかやってんじゃないの 知らないけど
- 785 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:38:58 ]
- 全力でソース追いかければ何とかなるんじゃね、知らんけど
- 786 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:35:23 ]
- プログラミングエキスパートの皆さんの力が必要です。
どうかどうかツールを作っていただけないでしょうか。 もはや風前の灯状態のスレを救ってやってください。 yahooきっずで先生1位にして教育委員泣かそうぜwww yutori7.2ch.net/test/read.cgi/news4vip/1250954051/
- 787 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:37:58 ]
- H S P で や れ
- 788 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:41:18 ]
- 本気で宣伝するならまとめページ作ってそこのリンク張るようにしてくれ
vipのスレのリンクなんか張ってもすぐdat落ちして見れなくなってしまうじゃないか 本当に見る人のこと考えてないんだな
- 789 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:33:48 ]
- なんでさりげなく適切なアドバイスしてんだよw
>>783 >>784 をプリプロセッサで展開
- 790 名前:デフォルトの名無しさん [2009/08/23(日) 11:49:15 ]
- valarray<T>::apply(T func(T))が,ふつうの関数しか受け付けないのですが,
関数オブジェクトを関数へのポインタに変換する関数って標準で用意されていますか? つまりptr_funの逆関数はあるでしょうか?という質問です. (自分で書けば一行ですが,メソッドが増えるのはよくないでしょう) 唐突ですが,よろしくお願いします.
- 791 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:25:24 ]
- 関数オブジェクトは関数の形をしてはいるものの、
それ自身のアドレスは持ってないから逆関数なんてないよ
- 792 名前:デフォルトの名無しさん [2009/08/23(日) 14:06:41 ]
- なるほど.わかりやすい説明ありがとうございます.
- 793 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:47:50 ]
- あれ、なんか調子悪い?
- 794 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:55:34 ]
- c_functionとかいうのがあるんじゃなかったっけ
使ったことないけど
- 795 名前:デフォルトの名無しさん [2009/08/23(日) 16:17:05 ]
- なるほど.これですね.
ttp://d.hatena.ne.jp/faith_and_brave/20090107/1231316933 まさに探していたものです.ありがとうございます! が,Boostがないところで困りそうなのでやめときます. valarray<T>もSTLライクな実装を加えてくれたらいいんだけど, たぶん遅くなるのがイヤなんでしょうね.
- 796 名前:デフォルトの名無しさん [2009/08/23(日) 16:22:50 ]
- うわっ.っていうかBoost VaultはBoostですらないんですね.
みなさん,ありがとうございました.
- 797 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:41:03 ]
- >>796
Boost File Vault Boostライブラリには入っていないけれど、その叩き台としたい、 というようなソースが転がっています。宝の山。^^ ってk.inaba氏が言ってた。
- 798 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:39:58 ]
- valarrayを捨てる手もありそうだが
- 799 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:07:21 ]
- >>790
valarray<T> y = x.apply(functor);としたいとして、 代わりにこれで我慢するのはだめ? valarray<T> y(x.size()); std::transform(&x[0], &x[0] + x.size(), &y[0], functor); valarrayも要素が連続している保証があるからこんなことして平気なはず。
- 800 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:45:54 ]
- void関数ではその処理を終えて外のスコープに処理を戻したい場合は
return; を記述しても良いということでしたが、 コンストラクタでも同様にreturn;を記述しても 良いのでしょうか? 記述した際にはそれより後ろにある処理は実行されないと期待してよろしいですか? g++ではこの通りの動作でしたが、これがC++の仕様なのでしょうか。
- 801 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 22:20:28 ]
- >800
大丈夫です. 蛇足ながら対応するであろう規格の文言は (6.6.3/2), (12.1/12)
- 802 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:33:21 ]
- 795があぼんなんだがまたfaith and braveでも貼ったのか?
いい加減にしろ。
- 803 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 02:10:07 ]
- あぼんしてるなら触れるなよ
アホなのか?
- 804 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:28:47 ]
- 何のためのあぼーんなんだよなw
- 805 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:56:27 ]
- 何でFaith and Braveを貼っちゃいけないんですか?
- 806 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:59:04 ]
- あぼーんであれスルーであれ、「お前の言葉は俺に効いてない」とアピールしたいあまり、
それを自分から言い出して、効いてるのがバレバレになる奴はたまに見かける。 たぶん居留守を使う時なんかも、居ないとアピールしたい一心で ドアの向こうの人に「いま居ません」とか言っちゃうんだろう。
- 807 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:03:18 ]
- 「レス番飛んでるんだけど、何きたの? ねぇ、何きたの?」
「お前、NGに入れたから」 「あ、そう。でさぁ(ry」 「NGに入れたっつってんだろぉぉぉぉぉ!」
- 808 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:21:54 ]
- 言葉にしない間しか成立しない主張を、言葉にすることで殺しちゃうんだよな。
「誰もお前にレスする奴なんかいねえよ」とか。 自分の言葉で直接相手を悔しがらせたい衝動、みたいなもんが低脳にはあって、 それに勝てずに自爆してしまうんだろうか。
- 809 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 10:43:00 ]
- あ…あんたのことなんて、何とも思ってないんだからねっ!
ってパターンも。
- 810 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 12:23:02 ]
- あるあるwww
- 811 名前:デフォルトの名無しさん [2009/08/24(月) 17:06:45 ]
- すみません.レス遅れました.
>>797 自分で適当にソースを改竄すればいいってことですね. >>798 valarray<bool> って嬉しくないですか? (vector<bool>のかわりに・・・) >>799 コピーコストに目をつぶって,これでいこうと思います. >>802-6 まったく議論が理解できないのですが,気分を害したのならすみません. c_function って検索してもあまり出てこなかったので便利かと思って リンク貼りました.他意はありません. 正直,あまり回答には期待していなかったのですが, 色々アイディアをもらえて感激しています.ありがとうございました.
- 812 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:22:59 ]
- > 正直,あまり回答には期待していなかったのですが,
> 色々アイディアをもらえて感激しています.ありがとうございました. この一言はどうして書いちゃったんだ。 「お前らには大して期待してなかったけど いないよりは役に立ったな」 って意味にしかとれないんだけど。 実生活でこれいったらもう目も当てられない ようなことになるぞ。
- 813 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:24:35 ]
- それはお前の読解力がおかしいんじゃないのか
- 814 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:27:44 ]
- >>813
いやおかしくないだろ。 別に悪意を持って読んだわけじゃないけど、 そう思った人は俺以外にもいるだろ。
- 815 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:35:51 ]
- >>813
お前の読解力だと > あまり回答には期待していなかった これは「誰の回答に期待してなかった」んだと思う?
- 816 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:44:25 ]
- 書き方が悪いのは確かだな。
あまり反応してもらえるとは思わなかったが、と書くべき所。
- 817 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:48:21 ]
- > あまり回答が付くことは期待していなかった
ならいいけど、 > あまり回答には期待していなかった=ろくな回答は無いと思っていた と取られるとね。 まあ2chだから当然な予測かもしれないけど、 わざわざ書かなくても良かったかもね。 でもそこは噛みつく程でもない気がするが。
- 818 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:37:42 ]
- むしろ>>812みたいなことをいちいち言っちゃう人のほうが
実社会では目も当てられない。 最近キレる人が増えたのは、 無礼な人が増えたよりも 他人の無礼をまったく許容できない赤ん坊のような糞人間が増えたからだって どっかの新聞に書かれてたなぁ。
- 819 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 00:07:27 ]
- で?
- 820 名前:デフォルトの名無しさん [2009/08/25(火) 01:29:40 ]
- 平謝りです.ごめんなさい.
> 実生活でこれいったらもう目も当てられない この通りですね,弁解の余地はありません. 人によって2ちゃんねるとの付き合い方は違うのに, それを無視した迂闊な発言でした. 感謝を伝えたかったのに・・・(涙)
- 821 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 01:56:50 ]
- >人によって2ちゃんねるとの付き合い方は違うのに,
>それを無視した迂闊な発言でした. 別にダメじゃないが何というか、一言多いよね。 再帰的に迂闊。
- 822 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:27:13 ]
- 再帰的わろたうぇw
- 823 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 03:22:47 ]
- 要するに、回答内容に期待してなかったんじゃなくて、回答されることを期待して
なかったんだろ?
- 824 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 07:31:11 ]
- >>821
そこ、俺も同じこと思った。 「俺の2chとの付き合い方を、迂闊どころか当然の顔をして無視し、踏みにじるお前ら」 って言いたいのかなと。 ある要素xを、自分より相手のほうがより強く持っていると判断した時に、 「xを持つことは悪いこと」という概念を大仰に押し立てて「xを持っててすみません」と平身低頭、 実はそういう皮肉攻撃、っていうデザインパターン。
- 825 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:01:05 ]
- べつにいいんじゃね
- 826 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:23:48 ]
- ぶっちゃけ何をそこまで絡んでるのか分からん
- 827 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:55:56 ]
- 世の中うぜえ奴ばっか
- 828 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:57:50 ]
- ケンカ売る気なら最初から本気でかかってこいや
この偽善者め とまあ、そんなことではないかと
- 829 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:43:38 ]
- 普通の
#ifndef HOGE #define HOGE 本文 #endif というインクルードガードがあるにも関わらず、 同時に 「コンパイラの種類がVCであるか、 もしそうならVCのバージョンを調べて #pragma once」 としているものがあるのですが これは意味があるのでしょうか? どうして前者のインクルードガードだけでは不足なのでしょうか?
- 830 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:59:10 ]
- >>829
微妙。 pc12.2ch.net/test/read.cgi/tech/1186262298/316 316 :306:2009/02/14(土) 04:46:01 >>313 マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを 読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が 考えられる。 そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。 en.wikipedia.org/wiki/Pragma_once
- 831 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:04:55 ]
- >>830
なるほど、 昔の冗長インクルードガードと同じですか。 ありがとうございます。
- 832 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:19:17 ]
- 尚、pragma onceの使える環境であればインクルードガードを省略できると言う考えは間違いである。
- 833 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:28:03 ]
- え?
#pragma once を使える環境でインクルードガード書かないと何かマズイの?
- 834 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:31:28 ]
- シンボリックリンクとかの関係でファイルの同一性がどうのこうのって問題?
- 835 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:35:23 ]
- そりゃ昔のバギーな実装の問題だろ。
- 836 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:58:05 ]
- 滅多なことでは問題にならんからなぁ。 gcc3.4で解決されたって話もあるし。
それにVCとgccとで使えるから、ふつーのひとはもう何も考えずに#pragma onceしちゃっていいんじゃないかなぁ。
- 837 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:32:29 ]
- 同じ内容の別のファイルをインクルードするときにバッティングが発生するのを防止することができない。
インクルードガードなら、それができる。その点を無視していいのなら、prgama onceで充分。
- 838 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:48:41 ]
- #pragma onceの問題点は非標準であるという一点に尽きる。
一々各コンパイラが対応しているかを調べるのは面倒。 ちなみに、上で#pragma onceの時のみに最適化される可能性があると書いてあるが GCCではインクルードガードを使った場合に同様の最適化が効く。
- 839 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:43:19 ]
- VC++2005なんだがDLLを配布したいんだけど
libとh同封しとけばVC6とかVC++2008とかの人でも使えるんかな?
- 840 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:52:59 ]
- VC8で#pragma onceの効果があるかどうか調べたけど効果はあったよ
- 841 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:14:58 ]
- 毎回インクルードガード書くより#pragma onceに対応してるか調べた方が結局楽、と
いう考えもある インクルードガードなら枯れてるから安心して使える、という考えもある インクルードガードは記述時にヒューマンエラーが起きやすいから嫌だ、という考えも ある #pragma onceはコードではなくファイルに依存するので、シンボリックリンクなどで 別のパスからインクルードされた時の問題などがあって嫌だ、という考えもある まぁ色々それぞれだな #pragma onceにユニークな識別名を付けられるようなのが最初からあれば最強だった んだろうが ちなみに#pragma onceは対応している処理系は結構多い
- 842 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:31:40 ]
- 出来るだけ多くの環境でも使えるようにしたいもののヘッダは
インクルードガードをかけるしかない。 たとえ#pragma once の利点を十分承知し、対応する処理系が増えているとしても。 そして、その利点を生かすためには、#ifdefで切り分けて#pragma onceも併用するという 一見アホらしいコードを書くしかない。 例えば、MSのWin32処理系では、全て#pragma onceが使用可能だが PSDK等のヘッダファイルは、他の処理系でも利用可能にするために インクルードガードも併用されている。
- 843 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:18:21 ]
- 仮にビルドが通らない処理系があったとして、
それがpragma onceのせいってのは、ありえないと思うけどな。 それ以前のクリティカルな要因で止まるだろ常考。
- 844 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:10:39 ]
- インクルードガードと#pragma onceが両方とも有効な状態って問題ある?
- 845 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:26:39 ]
- インクルードガードはインクルードを読み込む順番が固定できるから、循環参照を防げるメリットがあるね。
- 846 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:27:08 ]
- インクルードガードを矛、#pragma onceを盾だとして、
両方有効な状態だと、両手が砕けて紫龍が負ける そんぐらいです。
- 847 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:31:11 ]
- 別に両方書いても、片方が仕事してもう片方が潰されるだけのこと
ライブラリ屋は「VC++なら#pragma onceが先に掛かるようにした方が軽いな」とか 有効な順番を意識するが、別にしなくてもコンパイルが僅かに遅いとかその程度
- 848 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:35:54 ]
- >>844
問題ない。実際Boostの一部のヘッダではVCの場合に併用している。 >>842によるとWin32 APIのヘッダでも同様のことをやってるようだし。
- 849 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:42:13 ]
- 仕様として #include と書けば何度でもファイルを開いて展開するんだろうけど
その仕様が役に立つことってあるの?
- 850 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:50:48 ]
- >>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。
- 851 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:51:29 ]
- Boost.Preprocessorを使った再帰#includeでVariadic Template
みたいなことをするテクニックとか…
- 852 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:01:04 ]
- #ifndef HOGE_H
#define HOGE_H #if defined(_MSC_VER) && defined(__GNUC__) && ... #pragma once #endif 本文 #endif 結局こうするのがベストなのか めんどくせーな
- 853 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:04:36 ]
- >>852
それじゃどんなコンパイラでも#pragma onceが使われないぞw
- 854 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:17:23 ]
- いや、
VC++でコンパイルする時に -D__GNUC__ -D__BORLANDC__ をオプションにつける GCCでコンパイルする時に -D_MSC_VER -D__BORLANDC__ をオプションにつける という技を駆使しろ、という>>852のお告げ。
- 855 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:30:44 ]
- >>852
#if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif これだけでいい。併用は単にコンパイル時間の高速化の意味しか無いから、違いの出る VC++だけ書けば十分。 >>853 この書き方でちゃんと使われる。 ちなみに>>847は半分間違い。>>852で両方とも有効に働く。
- 856 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:31:13 ]
- 凄いな神の技だ・・
- 857 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:38:44 ]
- >>855
> この書き方でちゃんと使われる。 アホ? &&の意味も分からないのか?
- 858 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 00:43:12 ]
- >>855
使われねぇよw
- 859 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:24:50 ]
- >>855
#pragma once は、VC++4.2(_MSC_VER=1020)からサポートされたと考えていい?
- 860 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:47:27 ]
- 1000にしてるライブラリもある
1020にしてるライブラリもある
- 861 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:36:23 ]
- STL でつまづいています。
codepad.org/KNe3UsXV lst1.merge(lst2) でマージだけでなくソートされてしまうのはどうしてでしょうか?
- 862 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:41:10 ]
- なぜならmergeというのはマージソートでいうところのマージを行う関数だからです
- 863 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:12:32 ]
- こじつけ気味に言うとjoinでなくmergeだから。プログラム関連ではだいたい以下のニュアンス。
join:二つのものをつなげて一つにする。繋ぎ目で切り離せば元の二つに戻る。 merge:二つのものを混ぜて一つにする。元の二つに戻すには構成要素を一つずつより分ける必要がある。
- 864 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:01:23 ]
- >>861
しっかりドキュメント読め。 lst1.merge(lst2)はソートする。O(n) lst1.splice(lst2)はソートしない。O(1) >>863も書いているけど、mergeはどちらかと言うと順序関係を保存して結合する という意味合いが強いね。順序関係を作るためにソートが必要になるということ だと思う。
|

|