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/
596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ] シンタックスシュガーは もっと多くてもいい
597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ] オレサマプリプロセッサ作って好きに構文創作しれ
598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ] >>597 #define amigo friend; 愛用してます
599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ] フレンド程度に内面を洗いざらいさらしていいのか?
600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ] >>597 #define foreach BOOST_FOREACH
601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ] >>599 friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。
602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ] #define buddy friend; じゃないの?
603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ] friendはクラステンプレート中にテンプレート関数を定義したい 時に、暗黙の型変換ができるように使っている。 Effective C++で紹介されていた内容。
604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ] >>598 ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか
605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ] そこは指摘せずにそっとしておく所だろ
606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ] abort() if (!p); みたいに書けるようにはならんのか。
607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ] if (!p) abort() ;
608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ] >>606 C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。
609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ] perlではif文を後に書くのか?
610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ] >>596 言語の文法は最小限でライブラリで拡張できるほうがいい。
611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ] すいません嘘です
612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ] abort() if(!p) else exit(); とか普通に書きたいんじゃないの?
613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ] >609 文修飾子という扱いで後ろにも置ける。 if(e) { func(); } func() if e; は OK だけど、 if(e) func(); { func() } if e; はできない。
614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ] >>613 2種類の書き方があるっていうか、そういうのって分りにくくないのかな? 後に書くということは func(すっげー長い式なんたらかんたらどうのこうの) if e; だと読むときifを読み落としそうだなあ。
615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ] ワケ分からんw C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。 { func() ; } if e ; ができないというのは、ものすごく違和感があるな。
616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ] struct A; struct B{ B( A& ); } A a(); // これとか B b( A() ); //これが 関数宣言にみなされない書き方ないの? A a; B b( a ); とかじゃない方法で。
617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ] >>615 思うに。 { すげーー長い文 なんたらかんたら だらだらだらだら } if e; って読むのに困るよね。 do{}while()でも読みにくいのね。
618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ] do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、 それほど読みにくいってほどでもないんじゃないかな。
619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ] >>616 ないよ。
620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ] func() if e; はシンタックスシュガーの一例か? 混乱の割にメリットは感じられない。
621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ] ループの先頭などで、 break if foo continue if bar とかするのは気持ちいい。
622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ] だから、perl以外の言語は触らずに perlだけ使ってなよ。
623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ] ハ,,ハ (*゚ω゚ ) >>622 お断りします。Rubyも使います。 . (=====) _(_⌒) ) /\ `J  ̄ ̄\  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ | / \  ̄ ̄
624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ] perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?
625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ] foreach(int x, std::make_pair(v.begin(), it)) みたいにカンマが含まれても大丈夫なマクロが欲しいです
626 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:30 ] >614 Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という スローガンがあってな。 >615 Perl では { } は block であって文じゃないんだ。 >620 if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。
627 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ] >616 ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ] あの、ひとついいですか? 僕は現在高校2年生です。そんなぼくにもC++はマスター できます?
629 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:40:22 ] それなりのことはできるようになりますがマスターはそう簡単にはできません
630 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:46:51 ] >>628 それはお前次第やろ
631 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:55:49 ] >>625 C99の__VA_ARGS__が、C++0xに入る。
632 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:23:57 ] double* darray = new double[0]; delete [] darray; のようなことがプログラム中で起こるのですが、問題ありますか?
633 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:25:45 ] >>632 いいえ。何が心配?
634 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:35:02 ] サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする ダミーで1byteぐらい確保されんのかな
635 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:37:05 ] >>634 ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、 だいたいの実装がそんな感じ。
636 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:15:18 ] 0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる だがdarray[0]にアクセスすると未定義動作 変なの
637 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:27:16 ] void *operator new (std::size_t size) { if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size); }
638 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:35:06 ] error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'
639 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:01 ] "C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ? テンプレートではなく、仮想関数を使う方法で。
640 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:33 ] s/設計に/設計を/
641 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:09:36 ] >>639 あると思うよ。 今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。 ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。 臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。 強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。 でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね
642 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:52:23 ] >>639 俺はよく使ってる。 継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。 テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。
643 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 09:44:55 ] >>634 コンストラクタで malloc() を呼ぶと malloc(0) でも8バイトぐらいは確保される。 ここらへんは Cライブラリの実装次第だが、 あとで realloc()/free() に渡す可能性があるポインタということを 考えると0バイトであってもユニークなポインタが返されるべき。
644 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:48:18 ] templateを使った依存関係の解決ってどういうの?
645 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:20:35 ] >>644 class Hoge { void foo() { fuga_.(this); } Fuga<Hoge> fuga_; } 俺はこんなのを想像した。これは相互参照か? 単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。
646 名前:645 mailto:sage [2010/03/07(日) 12:22:14 ] 2行目訂正 void foo() { fuga_.bar(this); }
647 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:30:42 ] こういうのを相互参照って言うんじゃないか class b; class a { b* bb; }; class b { a* aa; };
648 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:59:32 ] 多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う 例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる
649 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:00:23 ] 理想的には継承と多相は独立した概念なんでしょうね。 要求される振る舞いが出来ることを保証する仕組みの一つが 継承であるだけで。
650 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:10:37 ] いわゆるダックタイピング
651 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:40:10 ] >>649 多相を実現する手段の一つが継承
652 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:35:47 ] ダックタイピングはコンセプトがあればなぁ
653 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:50:34 ] せめてコンパイラのエラーメッセージがわかりやすくなれば
654 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:48:11 ] スマポのお勉強してるんですが キャストってどうやって実装してるんでしょうか? class hoge : public fuga; void test(const oreore::unique_ptr<fuga> &p); oreore::unique_ptr<hoge> p(new hoge); test(p); といった感じの使い方を許可したいんですがどうにもうまくいきません 所有権の移動を禁止する方針で作っている(コピー代入を封印)のでキャストするときにテンポラリな値を返せません template <class Other> oreore::unique_ptr<Other> (void) { return oreore::unique_ptr<Other>(*this); // 禁止されてる }
655 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:10:08 ] >>654 std::move するんだよ。
656 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 03:22:13 ] >>654 C++0xなら、rvalue referenceが使える。 それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、 そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。
657 名前:デフォルトの名無しさん [2010/03/08(月) 04:21:56 ] >>654 コピー代入を封じるなら無理。 キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。 それこそ>>655 の言うように所有権の移動を許可する方向でやるしかない。 (もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)
658 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:36:01 ] const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。 const int* からconstとったら int* に決まってんじゃん、と。
659 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 08:09:18 ] >>658 const_castがオマエの言うような機能だったとして、このコードはどうすればいいんだ? int x = 0 ; int const * const p = &x ; const_cast(p) ; さあどれだ? const_cast<int * const>(p) ; const_cast<int const * const>(p) ; const_cast<int *>(p) ;
660 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:12:58 ] template<class vtype> class Test { public: Test( ){ } void func( ); }; のようなクラスのとき、 vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?
661 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:33:00 ] 特殊化すればいいよ
662 名前:660 mailto:sage [2010/03/08(月) 12:15:01 ] >>661 このようにしたのですが、うまく行きません。。。 template<class vtype> void Test<vtype>::func( ) { cout << "aaa" << endl; } template<class vtype> void Test<Test<vtype> >::func( ) { cout << "bbb" << endl; }
663 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:22:01 ] >>662 codepad.org/isjE5LKn
664 名前:660 mailto:sage [2010/03/08(月) 12:39:43 ] >>663 ありがとうございます。 クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合 同じようなコードが沢山生まれてしまうので 関数部分だけ特殊化できれば、と思ったのですが クラスのところで特殊化しなきゃダメなのですね。
665 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:40:57 ] >>664 codepad.org/QzjNzjhA
666 名前:660 mailto:sage [2010/03/08(月) 12:52:05 ] >>665 テンプレートと継承の組み合わせというのは考えられませんでした。 ありがとうございます。
667 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 13:41:10 ] >>655-657 サンクスです キャスト≒複製って知りませんでした 時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました
668 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 15:54:42 ] 構造体のメンバ変数を一括で代入する方法ってないんですか? 例えば構造体Aの変数のメンバ変数を全て0にするとか…
669 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 16:26:02 ] struct S { int a, b, c; double x, y, z; static S empty; }; S S::empty = { 0 }; S var; var = S::empty;
670 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ] サンクス。クラス使わないとダメなんすか?
671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ] pod作る関数を作ればいい。テンプレートで
672 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:05:33 ] struct S { int a, b, c; double x, y, z;}; S a={0}; これで事足りるんじゃ
673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ] >>672 それは代入じゃない。
674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ] あーざっす
675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ] 初期化だ(キリッ
676 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 19:48:52 ] >>659 const_cast<int *>(p)だろ 他のconstが必要なら後で付ければいい 何があかんのですか
677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ] const const_iterator* it; const_cast(it) これはどうなるんだ? const_iteratorはポインタかもしれないしクラスかもしれない
678 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:48 ] const_iteratorがconst Type*だった場合、 itの型はconst Type *constでconst_castするとconst Type*になる。 そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。
679 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:43:53 ] >>676 void const * const * const cpcpc = 0; void ** pp = const_cast<void**>(cpcpc); void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?
680 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:34 ] >>678 >itの型はconst Type *constでconst_castするとconst Type*になる。 なんでType*じゃないんだ?>>676 と矛盾しない?
681 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:11:07 ] std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?
682 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:15:54 ] 無闇にメンバ関数にするとprivateにアクセス出来てしまうから、 privateにアクセスする必要のない関数は メンバでもfriendでもない関数にするのが良いって 偉い人が言ってた
683 名前:681 mailto:sage [2010/03/08(月) 22:28:24 ] >>682 ありがとうございます。 もし自分がcomplex作ったら、conj( )をメンバ関数にして privateなデータを変更してしまうように実装しそうなのですが これは良くないんですかね?
684 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:34:42 ] そもそも変更することがおかしいんじゃないかい。 メンバ変数にするにしてもconstにするべきだと思う。 共役複素数を求めるだけだよね?
685 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:42:05 ] むしろその程度の軽い型なら不変型にしちゃった方が
686 名前:681 mailto:sage [2010/03/08(月) 23:02:53 ] >>684 イメージ的にはこんな感じです。 myComplex<double> mc0(2,2); // 2+2i mc0.conj( ); // 2-2i グローバル関数にするとコピーが発生してしまうので 良くないのかなぁ、と思ったのですが。
687 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:14:08 ] 実測した訳じゃないが、 あまり効果なさそうな気はする。 コードを見やすくしたほうがいいんじゃないだろうか。
688 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:28:29 ] なんで配列はイニシャライザリストで初期化出来ないんですか?
689 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:50:50 ] C++0xにご期待ください
690 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:16:28 ] >>679 const増やすのはstatic_castでもreinterpret_castでも出来る お好きな方で
691 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:19:23 ] >>690 キャスト無しで通っちゃうよ。
692 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:28:37 ] >>676 void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード // ここから自前のコード void g(void const* const a[]) { f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう } こわくね?
693 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:23:22 ] まあconst_cast使うなってのが基本だから それを書きやすくするうえに他のキャストと違う形になる 省略記法なんて認められないと思われる
694 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:04:10 ] >>690-691 うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、 なんかおかしいのかな。
695 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:21:42 ] どうせ<>書いてないとか
696 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:26:55 ] 通らない ttp://codepad.org/d4Wo3ozT
697 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:48:53 ] void ** const cpp = static_cast<void **>(pp); えっ?
698 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:49:47 ] >>696 それは、規格の文面によって、明示的に禁止されている。 4.4 Qualification conversions [conv.qual] なぜできないのかというと、それを用いることによって、const性に穴が生じるから。 規格のサンプルコードを、適当にコメントを補って引用すると、 int main() { const char c = ’c’; char* pc; const char** pcc = &pc; // 仮に、これが許可されているとする *pcc = &c;// ppcを介して、pcを変更している。 *pc = ’C’; // pcはconstでもないのに、constなはずのcを参照出来ているので、変更できる。 } つまり、constなppcを介して、非constなpcを変更できてしまうので、 pcが、明示的なキャストもなしに、constなオブジェクトを参照することが可能になってしまう。
699 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:03 ] >>698 規格の参照までしていただいて、ありがとうございます。 参考になります。 ということで、これを踏まえて改めて>>679
700 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:31 ] ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 環境で例外クラスの実装を見ようと思ったのですが /usr/include/c++/4.4/stdexcept に logic_error などの宣言はあるのに実装が書いてありません。 どのファイルを見たら良いでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:07:03 ] const_castの話してるやつはコテ着けるか 婉曲表現と皮肉をやめて直接主張しろ 何人かいて訳が分からない
702 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:40:34 ] はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので void const * const * const cpcpc = 0; void ** pp = const_cast<>(cpcpc); // 全はがし void const ** cpp = const_cast<void const**>(pp); // つける時は書く // void const ** cpp = const_cast<void const**>(cpcpc); // 一部はがしのときもこれまで同様書ける というのを望んでんのかも
703 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 09:06:33 ] がんばれ 658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01 const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。 const int* からconstとったら int* に決まってんじゃん、と。
704 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:09:06 ] constの話で盛り上ってるからついでに聞きたいんだけど struct X { int *p; void test(int x) const { *p = x; } }; こう書くとconst指定してるのにオブジェクトの内容が変化してる これって合法なの?
705 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:14:13 ] >>704 Xのオブジェクトはpであることを思い出せ。 pはint*型だから「int型の値のあるメモリの位置」を指している。 *p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。
706 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:34:24 ] pは宝の地図 *pは宝の中身 Xのメンバはpつまり宝の地図 だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと *p = xは宝の中身を入れ替えているだけ
707 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:39:05 ] 中々面白い例え方をするな。
708 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:54:36 ] **pは宝の地図の在り処を書いた地図か。判りやすいね。
709 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:57:01 ] ゲームのお使いクエストだな。 そのお宝の例えは俺は結構好きだな。
710 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:19:18 ] へー、いい表現じゃん
711 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:23:11 ] サンクス 正常な動作だったのね
712 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:43:29 ] new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。 new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。 難しいな。
713 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:38:02 ] new int*なんてあんの? あるなら知らなかった。
714 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:58 ] 型なら何でもnew出来るだろ
715 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:46:35 ] 関数型もできるっけ? 関数ポインタじゃなくて。
716 名前:706 mailto:sage [2010/03/09(火) 21:01:33 ] 何の気無しに書いたんで、反応あって驚いてる。 >>706 は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、 今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。 たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で まったく混乱せずに済んだ。>>708 が言うように、ポインタのポインタも 「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。
717 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:46 ] C++は勉強するほど自信がなくなっていくな・・・boostマジキチ
718 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:10:15 ] >>716 初心者には分かりやすい言い例えだね。 俺もそれ使わせてもらいます。
719 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:24:34 ] 住所とか例えるより絶対わかりやすい。
720 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:30:25 ] >「勇者は宝箱を開けた。なんと宝の地図を見つけた!」 あるあるw
721 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:31 ] ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが
722 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:54 ] s/宝箱/宝箱の地図/
723 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:06:18 ] で?
724 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:35:08 ] ヌルポインタはミミックだな 開けると死ぬ
725 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:44:47 ] 住所にたとえるのと変わらんと思うがね
726 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:46:21 ] ていうか別に喩えなくても分かるから
727 名前:デフォルトの名無しさん [2010/03/10(水) 01:46:56 ] ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ
728 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:46:42 ] minorという変数がプログラム中にありますが、 cstdlibをインクルードしたら以下のようなエラーが出るようになりました。 error: macro "minor" passed 2 arguments, but takes just 1 これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?
729 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:58:04 ] >>728 どう読んだらそんな解釈になるんだよ。 そのエラーが再現する最小ソースを作ってみれ。
730 名前:728 mailto:sage [2010/03/10(水) 05:25:53 ] >>729 言葉足らずでした。 上記のエラーは、 ctdlib の中(もしくはcstdlibがインクルードしているファイルの中)に 引数を1つとるminorというマクロ(?)があるから、 引数が2つある自作クラスのオブジェクト名をminorにしてはいけない ということでしょうか? 以下ソース #include <cstdlib> class Hoge { public: Hoge( int i, int j ){ } }; int main(int argc, char* argv[]) { Hoge minor(1,1); return 0; }
731 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:36:58 ] >>730 別に言葉足らずじゃない。>>729 が寝ぼけてるだけ。 環境によってはsys/types.hにminorマクロがあるので使わない方がいい。
732 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:43:19 ] >>731 ありがとうございます。
733 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:56:50 ] >>730 手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。 ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?
734 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:01:57 ] >>731 cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう 予防しとかないといけないものなの?どっかの環境での常識?
735 名前:728 mailto:sage [2010/03/10(水) 06:04:13 ] >>733 Ubuntu 9.10 gcc version 4.4.1 です。 gcc -v の内容全部貼ると Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
736 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:14:04 ] -std=c++98 とかすれば逃げれたりするんじゃないかなー。 まぁ #undef すりゃいいんだけどね。
737 名前:728 mailto:sage [2010/03/10(水) 06:35:01 ] 以下のソースコードコンパイルすると #include <cstdlib> void minor( int i, int j ) { } int main(int argc, char* argv[]) { return 0; } test.cpp:5:26: error: macro "minor" passed 2 arguments, but takes just 1 test.cpp:5: error: variable or field ‘minor’ declared void test.cpp:5: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x というerrorと、warningが出ます。 >>730 のソースコードではwarning出ませんでした。
738 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:54:54 ] functionってすげいな ソース眺めるだけで勉強になる
739 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:43:07 ] struct A; struct B{A a;}; struct A{int a;}; int main(){return 0;} 前方宣言したら、後で定義してれば 使えると思ってたんですが これがエラーになります Bの中をA* aにするとエラーが消えるのですが その辺に理由があるんでしょうか?
740 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:53:13 ] ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね Aのデータは定義されるまでは全く参照出来ないのか struct A; struct B{void f(A *a){}}; //セーフ //struct B{void f(A& a){}}; //セーフ //struct B{void f(A a){}}; //アウト //struct B{void f(A& a){a.a;}}; //アウト //struct B{void f(A* a){a->a;}}; //アウト struct A{int a;}; int main(){return 0;}
741 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:01:37 ] サイズがわかってるかどうかで判断できるよ
742 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:10:29 ] なるほど、セーフなのはアドレスですもんね ありがとうございました
743 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:23:35 ] >>738 しかしそんなソースを仕事で書いたら 同僚に白い目で見られそうだww
744 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:40:04 ] すみません vectorのresizeでサイズを大きくした時に 拡張した結果メモリの再配置が起こったとすると resizeする前のデータはコピーされるのでしょうか?
745 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:42:12 ] ざれます
746 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:10 ] >>744 www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html
747 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:18 ] ありがとうございます><.
748 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:56:34 ] クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:59:17 ] 普通に使用すればいいです Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理
750 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:51:16 ] オペレータオーバーロードの ->* って、どう定義してどう使うんですか? ググール先生に聞こうと思ったんだけど記号検索できませんでした
751 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:55:22 ] ttp://homepage2.nifty.com/well/Operator.html#arrow_ast
752 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:06:36 ] 結合力最強の二項演算子なので マクロとかで細工するときに便利なこともあります
753 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:24:57 ] >>751 どうもです しかしなんだこれって感じですね ポインタエミュレートのために (myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c); といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・) >>752 そういう特殊な使い方ってよく思いつくもんですよね
754 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:03:47 ] >>748 徹底したクラス指向で行くならこの程度のものになる。 int main() { MainClass m; return m.main(); }
755 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:20:39 ] int main() { return MainClass()(); } 徹底するならこうだろーと思った俺はそろそろ寝るべきか
756 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:51:32 ] operator RESULT(); //用意するだろ普通
757 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:29:37 ] throwでint投げると問題があるようなことを聞いたのですが、 どんな問題があるんでしょうか? ポインタでキャッチしてしまうとか?
758 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:33:36 ] 受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから
759 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:44:47 ] なるほど。よくわかりました。
760 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:01:56 ] istringstream の putback って何回でも呼んでおk?
761 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:28:31 ] boost::functionとstd::functionって混在しても問題ありませんか? それともどちらか一方にすべきでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:54:55 ] 混在させたこと無いからわからんけど、大丈夫じゃね? どっちも最終的にはただの関数オブジェクトになるわけだから boostのほうにstdのfunctionを代入することも逆もできるはず 名前は名前空間があるからかぶるわけないし
763 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 22:54:37 ] ABI互換性は?
764 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:03:33 ] 混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?
765 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:15:46 ] namespace boost = std ;
766 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:28:03 ] ありがとうございます。 今のところはboostが使えるならboostが無難かと 思うのでboostにします。
767 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:34:01 ] >>766 えぇーーー 普通は逆でしょ 標準で済むなら標準を使うのが筋でしょ
768 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:38:24 ] >>767 std::function はまだ標準じゃないでしょ。
769 名前:767 mailto:sage [2010/03/11(木) 23:40:20 ] >>768 そりゃそうだ boost と std だけ見て function を見てなかったよ
770 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:48:14 ] >>766 も「今のところは」って言ってるしな。
771 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:27:32 ] placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?
772 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:30:56 ] >>771 何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか std::uninitialized_copy() とかが使えるんじゃない?
773 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:16:48 ] template <class T> void Caller( T &f ){ f(); } に対して、 void Callee(); があり、 Caller( Callee ); // これだとコンパイルが通るのに、 Caller( &Callee ); // こっちは通らない のはなぜですか?
774 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:40:58 ] codepad.org/WzrQ1BNa それはポインタだからさ
775 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:32:25 ] 関数の引数に配列の参照を渡したいんですが、どうすればいいですか
776 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:16 ] >>774 サンクスです。 T &fは「関数の参照型」と言えばいいんでしょうか? また、関数ポインタを呼ぶ際は、 (*f)(); //デリファレンスあり f();//なし 2通りで呼べますが、これはシンタックスシュガー的なものですか? どっち使ってもOKですか?
777 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:42 ] template<typename T, size_t N> void func(T (&x)[N])
778 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:39:50 ] typedef std::deque<int>::iterator iterator; iterator tekitou; //... tekitou == iterator(); //tekitouに代入処理がなかったらtrue を期待して組んでたら例外が発生してパソコンが爆発したんですけど tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?
779 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:52:18 ] >>778 パソコンが爆発するプログラムを作っているんだったら いますぐやめなさい。
780 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:53:54 ] パソコンが爆発するプログラムを作っているのではありません。 パソコンが爆発するのを防ぐプログラムを作っているのです。
781 名前:デフォルトの名無しさん [2010/03/13(土) 01:15:50 ] 爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・
782 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:17:30 ] 兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。 ご教示いただけないでしょうか?
783 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:20:26 ] 判定する方法は無い ポインタと違ってイテレータにはNULL入れられないからねぇ int *ptr = 0;
784 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:21:45 ] 本当に爆発するというなら、 本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。
785 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:22:35 ] bool変数でも使って対処しとけ
786 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:24:23 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・
787 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:25:48 ] こういうときは boost::optional だっけ?
788 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:26:47 ] つtuple
789 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:30:12 ] end()をNULL代わりにしたらあかんの?
790 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:32:49 ] 今回もそうでしたが、コンテナを特定できないとそれは使えません。
791 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:55:44 ] じゃあNULL用の適当なコンテナ作ればいいじゃん
792 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:58:30 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・
793 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:59:08 ] nil使えよ
794 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:06:15 ] iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな? わざわざややこしいことやってるように見えるけど
795 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:43:02 ] namespace boost { namespace detail { struct none_helper{}; } typedef int detail::none_helper::*none_t ; } // namespace boost namespace boost { none_t const none = ((none_t)0) ; } // namespace boost このコードはいったい何をしようとしてるわけ?
796 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:55:22 ] ググった?
797 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 04:11:26 ] >>795 他のどんな型からも自動変換されないし、 他のどんな型へも自動変換されないような変数を定義してるんじゃね?
798 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:23:39 ] >>468 といい>>778 といい、最近のPCは爆発しすぎだな
799 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:27:14 ] 俺のPCは蒸着するぜ0.05秒で。
800 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:52:58 ] 手荷物どころかそのうち航空貨物での取り扱いも断られる
801 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:31:03 ] そして単純所持禁止へ
802 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:33:53 ] コンピュータが爆発するって 昔の映画や漫画によくあったな
803 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:52:27 ] 「映画の中のコンピュータ」って ジョークがあったな
804 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:20:38 ] 「なお、このPCは自動的に消滅する」
805 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:22:54 ] >>799 あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
806 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:27:14 ] >>795 なんだこれ超ムズイじゃねぇか。
807 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:03:28 ] pointer to memberって使ったことあんましないからわからんけど ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない なおかつメンバが空だからnullしか入れるものがない したがってただひとつの状態を持てるってことかな C++ってこういう気持ち悪いバッドノウハウ多すぎるよね すなおに仕様でnil型導入すればいいのに
808 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:26:04 ] 一般的な実装上の都合からいうと、 メンバへのポインターは、単なるオフセットに過ぎない。
809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ] null_ptrをお待ちください
810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ] >>807 実装上の都合を言語ユーザに押し付けてる感はあるな
811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ] >>810
812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ] ごめん、途中で送信してしまった。 >>810 他の言語はともかく、 余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ] >>810 型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、 何のことを言ってるの?
814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ] void Test(int *array) { // ごにょごにょ(配列の長さについては考えないとする) } みたいな関数があったとき、 int array[3] = {0,0,0}; Test(array); はコンパイルできるのに、 Test({0,0,0}); はコンパイルできない。 配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、 良い手段ない? それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ] 名前付けないと可読性下がりそう
816 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:19 ] >>814 C++0x をお待ちください。 名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら __LINE__ あたりとくっつけとけばよかったりしない? C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら ↓こんなのが使えたり。 void Test(int *array); #define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0) void Tests() { TEST({1,2,3}); TEST({4,5,6}); TEST({7,8,9}); }
817 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ] 可変長引数マクロ関数使えるのか
818 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:36 ] >>814 ヘルパー関数を使って、 std::vector<int> make_vector(int num, ...); Test(&make_vector(3,0,0,0)[0]); とか、 Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00"); などの悪手しか思いつかない。
819 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ] 配列リテラルとかLL出身者っぽい要望だなぁ
820 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:05 ] >>816 レスありがとうございます。 > 名前が不足するというのがよくわからん Testを沢山呼ぶんですよ。 それで、 int array1[3] = {0,0,0}; Test(array1); int array2[3] = {0,0,1}; Test(array1); int array3[3] = {0,0,2}; Test(array1); 以下大量に。 (実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる) __LINE__をつけるというのはいいですね。 >>818 レスありがとうございます。 STL不勉強のためすみませんが今はちょっとよくわかりません。 >>819 はい・・・LL出身です・・・。 とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。
821 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ] >>820 なんかTestの引数が全部array1になっちゃってますが、 2回目はarray2、3回目はarray3です・・・。
822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ] C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。 Test((int[]){0,0,0});
823 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:37:24 ] 二次元配列にすればいいだけなんじゃない int arys[100][3]; for(int i=0;i<100;++i){ arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; test(arys[i]); }
824 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ] >>822 std::initializer_listが入る
825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ] >>823 >>820 でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、 必ずしも arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; となるわけではないのです。 質問のために簡略化しているので・・・すみません。
826 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:44:44 ] それなら読み込めばいいんでは? int arys[100][3]; for(int i=0;i<100;++i){ cin >> arys[i][0] >> arys[i][1] >> arys[i][2]; test(arys[i]); } これは標準入力だけど、別にファイルからでもいいし
827 名前:814 mailto:sage [2010/03/13(土) 21:50:09 ] >>826 そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは よくないかなぁと思ったんですが、 データをあまり見られたくないんですよ。 それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと 見られにくいかなぁと思ったので。 別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ] 慣れたLLでコードジェネレートしればいいじゃない
829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ] >>828 なるほど、考えてみます。ありがとうございます。
830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ] >>827 __VA_ARGS__ は使えんのか? >>816 にあるやつ。
831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ] >>830 Visual C++ 2008なので使えると思います。 考えてみます。
832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ] >>820 int *arrays[] = { { 0,0,0 }, { 0,0,1 }, { 0,0,2 } }; みたいなのじゃダメなの? argv と同じやりかた。
833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ] >>832 コンパイルしてみてから言おうな。
834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ] めんどくせw
835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ] >>816 __LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ] >>835 同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。 この場合は単にスコープ分けるだけでも済みそうだし、 __VA_ARGS__ が使えるなら >816 のやつがいいと思う。
837 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:58:41 ] つーか規則性の無いグシャグシャなデータにしたのがそもそも間違いだろ。なんで誰も突っ込まないんだよ データってのは規則正しい形式なのが当たり前で、規則正しいからこそコードを簡潔に記述できるんだよ struct Recode { int num[5]; char str[80]; }; Recode recodes[N] = { {〜}, {〜}, }; for(int i = 0; i < N; ++i) Test(recodes[i]); こんな感じに書くのが基本に忠実な答え まずはデータ形式から見直そう
838 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:08:15 ] >>837 int の配列って言ってるだろ。十分なデータ構造じゃないか。 規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。
839 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:20:29 ] (データ長+データ実体)*nを1次元配列で持つとか
840 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:24:19 ] 質問のために簡略化してるって構造のことじゃなくて値のことだったのか? だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう
841 名前:814 mailto:sage [2010/03/13(土) 23:52:42 ] Visual C++ 2008ってC99は未だっぽいようです・・・ つまり複合リテラル>>822 も可変長引数マクロ関数>>816 も無理のようです。 >>840 構造も、値も、です。 >>814 にかいたTestは実際はオブジェクトのコンストラクタなのですが、これの定義は CTest::CTest(int Id, const char* Name, const char* Species, const char *Sex, int* Hp_max, int* Attack, int* Speed) : (メンバ初期化リスト省略) {} と、>>814 で挙げました配列は3つ、さらに文字列や整数値が引数にあります。 で、これのインスタンスを5個ほど作る処理を書きたいのです。 多次元配列を用いようとすると、Hp_maxとAttack、Speedをまとめて記述し、IdやName,Speciesなどの値と離れて記述する ことになります。できればインスタンス毎にまとめておきたいのですが・・・
842 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:07:58 ] 実際にどう記述してるのか分からん
843 名前:814 mailto:sage [2010/03/14(日) 00:09:58 ] 一応締切?とさせていただきます。 レスを頂いた皆さま、大変参考になりました。ありがとうございました。
844 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:14:23 ] >>841 じゃあ struct X { int Id; const char* Name; const char* Species; const char* Sex; int Hp_max[N]; int Attack[M]; int Speed[O]; }; X xs[] = { {1, "a", "b", "c", {1, 2}, {3, 4}, {5, 6, 7}} }; では?
845 名前:814 mailto:sage [2010/03/14(日) 00:24:12 ] >>844 メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。 親クラスが存在するクラスではそういう書き方はできなかったかと・・・
846 名前:844 mailto:sage [2010/03/14(日) 00:28:37 ] >>845 初期化用データの格納用に >>844 の X のような構造体を定義すれば 初期化データをすっきり記述できるんじゃないかってこと
847 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:28:58 ] データ部分は関係ないだろ
848 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:30:13 ] >>827 どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ
849 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:39 ] >>841 ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。
850 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:49 ] コンストラクタを一つ増やせってことじゃない?
851 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:37:51 ] >>845 CTest::CTest(const X &init) : m_id(init.id), ・・・ { }
852 名前:814 mailto:sage [2010/03/14(日) 00:38:12 ] >>849 すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、 これで終わりにさせてください。 乱暴なようで申し訳ないのですが、以後レスは致しません。
853 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:22 ] warota
854 名前:デフォルトの名無しさん [2010/03/14(日) 00:39:42 ] ┌─┐ |も.| |う | │来│ │ね│ │え .| │よ .| バカ ゴルァ │ !!.│ └─┤ プンプン ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д) | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U 〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
855 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:41:22 ] gccのC99拡張機能を有り難がって使ってんじゃねーぞ 聞く方が混乱するだけだ
856 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:42:56 ] えっ
857 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:15:29 ] template <int num_of_args> class hoge { void operator () (int a1, int a2, ...); }; num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?
858 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:22:48 ] >>857 「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が いくらかマシな手段となるかもしれない。
859 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:23:52 ] >>857 これじゃダメっすか template<int N> class hoge { void operator()(int a) { BOOST_STATIC_ASSERT(N == 1); } void operator()(int a, int b) { BOOST_STATIC_ASSERT(N == 2); } void operator()(int a, int b, int c) { BOOST_STATIC_ASSERT(N == 3); } };
860 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:26:06 ] >>857 C++0xを、首を長くして待て。
861 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:28:23 ] きりんさんになっちゃいそうです><
862 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:38:21 ] >>857 num_of_argsが要らなくない?無いほうがすっきりしないか?
863 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:55:12 ] 俺もそう思う。 どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?
864 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:07:19 ] >>858 boostはよく知らないんですが後でちょっと探ってきます >>589 これは面白いですね コード生成は避けられんませんが、ちょっとシンプルになりました >>860 待ちきれません >>862 ,863 array<3> a(10, 15, 20); a(1, 5, 3) = 100; こんな感じで使おうと思ってるんで、num_of_argsは欲しいです
865 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:10:31 ] 俺も要らないと思うわ
866 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:13:28 ] なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。
867 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:14:53 ] >>866 x[Index(a, b, c)] で代用できるから
868 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:27:47 ] 1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。 早い話がvector<vector<vector<int>>>だね。
869 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:39:36 ] >>860 g++ 4.4ではもう使える。
870 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:40:37 ] ここ数日の質問って何をしたいのか見えてこないのが多いな
871 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:10:09 ] c++の文法書ってありますか? 書店に行ってもプログラミングの入門書ばかりで 言語仕様の解説書が見つからなくて困ってる 組み込みやる事になってgcc、GNUARM使う事になったんだが 文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)
872 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:11:27 ] 仕様書読めばいいじゃない
873 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:13:49 ] >>871 JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!
874 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:16:24 ] >>871 ja.lmgtfy.com/?q=C%2B%2B
875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:19:23 ] 文法がまるでわからないのなら むしろ入門書のほうがいいんじゃないのかw ってか組み込みならそんなに難しい文法の知識いらないし、 むしろ環境構築の方が面倒な気がするけどね
876 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:22:54 ] >>871 単にCの延長でいいなら入門書読めば事足りるはず。 C++らしいコードが書きたいなら Effective C++とかMore Effective C++でも読んどけば?という感じ。 厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、 これを読んで特定の目的を達成するコードが書けるとは思えんなあ。
877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:26:22 ] まぁ気持ちは分かる 入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして いきなりstd::coutとか使い出すし
878 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:30:29 ] >>877 しかも、その場合、ADLまで絡んでくるしな。
879 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:34:03 ] 俺も昔厳密な仕様が知りたいけど 仕様書とかダルイっていう舐めた態度の時にこの本買った www.hir-net.com/book/book14/index.html >>877 な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね 最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし
880 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 04:04:01 ] 組み込みなら組み込みのスレで尋ねた方がいいと思うぜ C++の一般論が必ずしも当てはまるとは限らんから
881 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:59:49 ] >>871 組み込みなら C 使えよ。 お前みたいなのが C++ 使うとバグが増える。 とりあえずヘッダ自動生成とかのツール類で 勉強してからにしろ。
882 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:03:01 ] デストラクタもないCにいわれてもな
883 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:06:49 ] >>881 > とりあえずヘッダ自動生成とかのツール類で > 勉強してからにしろ。 何を言っているんだw
884 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:13:53 ] というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。
885 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:58:08 ] >>882-884 組み込みは製品になるとスタックダンプとレジスタぐらいしか なくてアセンブラだけで解析すんの大変なんだぜ。 お前らみたいな糞コードのバグ解析がこっちに 回ってきて迷惑なんだよ。
886 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:04:43 ] そういうクソを調教するためにMISRA-Cとかがあります
887 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:29:06 ] >>885 組み込みつったって規模があるだろう それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある 少し極論じゃないのか
888 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:40:51 ] Cでバグが減る根拠を挙げてもらおうか
889 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:46:53 ] 誰もそんな事言ってないから
890 名前:デフォルトの名無しさん [2010/03/14(日) 18:41:27 ] template<typename T> void foo(const T& arg){ if(T::hoge_flag){ func_true(arg); } else{ func_false(arg); } return; } この様なコードがありまして、T::hoge_flagは T型によりコンパイル時に決定されるconst bool型の定数とします。 すなわち T::hoge_flag の真偽によって func_true(arg);とfunc_false(arg);の一方だけが必ず実行され 他方は必ず実行されないことになります。 こういった場合は、テンプレートメタプログラミングを使って 一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。 それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。 よろしくお願い申し上げます。
891 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:09:38 ] コンパイラの機嫌しだい
892 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:10:12 ] >>890 最適化に期待すれば十分だと思うよ。 実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。
893 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:20 ] そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら 困る・・・か?そんなバカコンパイラは想定しない方が良いか。
894 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:28 ] struct when_true{ inline static void func(arg_t); }; struct when_false { (ry }; if_<flag, when_true, when_false>::type::func(arg); 確実性を考えると↑のように関数化しないといけない 結局のところオーバーヘッドは避けられないからif elseのままでいいよ
895 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:09 ] たとえば、 template<bool N> void func(); でN値による特殊化なんかできるのかな
896 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:32:55 ] こんなので切り替えれられるとおも浮けど、わざわざ属性を示すクラスが下からあればいいけど、わざわざ作るなら、ifのほうが分りやすいかもな。 class TypeA{}; class TypeB{}; class hoge :public TypeA { }; class fuga :public TypeB { }; template<class T> void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeA*>>:type* =0) { } template<class T> void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeB*>>:type* =0) { } void test() { hoge h; fuga f; func(h); func(f); }
897 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:07:40 ] if文の削除なんてあまりにも可読性が低くなってる場合しかオレはやらないな 速度やコードサイズの最適化なんてたかがしれてるだろ >>896 わざわざややこしくしてないか? それだったらenable_if_cにして直接T::hoge_flagを突っ込めばいいんじゃん typename boost::enable_if_c<T::hoge_flag>:typeと typename boost::disable_if_c<T::hoge_flag>:typeだけで 他にクラスや関数を用意する必要はないはず まあこんなことしなきゃならないほどカツカツなら 他に検討すべき箇所があるんじゃないのかね
898 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:08:46 ] >>895 できるっしょ。 template<bool b> void func(){〜}; template<> void func<true>(〜); これでおkでは?
899 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:44:03 ] もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。
900 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:27 ] 関数ポインタは最適化の障害で(ry
901 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:55:24 ] コストとコードサイズ小さくしたいのにカンポはねーよ・・・
902 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:57:24 ] 結局ifelse書いて最適化に期待するのに落ち着きそうだな 関数化するまでも無い分岐の場合は特にそうだろう
903 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:40 ] この状況で関数ポインタ持たせたら 逆効果じゃねぇかwwwww
904 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:00:55 ] コンパイル時に定まるif elseで絶対に実行されないことが 分かる場合、それでも最適化できないバカコンパイラって 知っている? それを最適化できないとなるともっと重大な所でも 最適化できなさそうな気がするが。
905 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:19:48 ] codepad.org/3HNtsPNZ なんでこれが期待どおりに動いてるのかよく分からない
906 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:47:54 ] Conceptさん・・・Conceptさんを呼べ!!
907 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:51:07 ] templateの部分特殊化とSFINAE。 メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば (その場合のみ)has_swap_implの部分特殊化が選択される。
908 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:55:48 ] カードゲームの効果解説かと思った。
909 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:36 ] >>888 >>871 は C はそれなりに書けるようだが、 解説書見ながら C++ で書いてより高品質なソフトが 書ける理由がないだろ。 どうせ new[] したのを delete するようなコード 書いて地雷仕込むのがオチ。
910 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:18:09 ] >>905 まず、has_swap<T>はどんな型にも適合するのでhas_swap<hoge>の実体化が行われる。 コンパイラはhas_swap<hoge>の基底クラスとして、has_swap_impl<hoge, void>を実体化しようとする。 なお、has_swap_implの第2テンプレート引数は省略されているのでデフォルトのvoidが使われる。 has_swap_impl<hoge, void>を実体化しようとした際に、 コンパイラはまず、より特殊化されたバージョンである 14行目のバージョンに適合するかのチェックを行う。 ここで問題は、typename has_swap_helper<T, &T::swap>::type が void と一致するかどうか。 ・メンバ関数としてvoid T::swap(T&)が存在するならば、has_swap_helperのテンプレート引数が確定し、 かつ4行目のテンプレートに適合するので、4行目のテンプレートが実体化され、voidになる。 すると、has_swap_impl<hoge, void>は14行目のバージョンに適合する。 ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 通常の感覚ならばエラーになりそうだが、 SFINAEの規則によってエラーとはならず、 単に14行目のバージョンが候補から除外される。 コンパイラは次に9行目のバージョンの実体化を行おうとする。 9行目は何でも適合するので、has_swap_impl<fuga, void>は9行目のバージョンに適合する。 あくまでもhas_swap_impl<hoge, void>がどれにマッチするかが問題なので、 たとえば6行目のtypedefをintに変えたりするとダメ (その場合、9行目を class U = int にすればいい)
911 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:20:30 ] っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ 特殊化とかADLとか絡んでついていけない時がままある
912 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:25:19 ] 言い出しっぺの法則発動
913 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:42 ] あ、>>910 間違えてた。 誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。
914 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:34:08 ] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TestData { int id; char *name; char *sp; char *sx; int nr_param; char *param; } TestData; #define PARA(max,at,sp) ":" #max "," #at "," #sp static TestData test_array[] = { { 1, "NA", "SpA", "M", 3, PARA(0, 0, 1) PARA(2, 3, 4) PARA(5, 6, 7), }, { 2, "NB", "SpB", "???", 1, PARA(1, 2, 3), }, }; void dump_testdata(TestData *t) { int i; const char *p; printf(" Id:%d, Name:%s, Sp:%s, Sx:%s\n", t->id, t->name, t->sp, t->sx); p = t->param; for ( i = 0; i < t->nr_param ;i++) { int m, a, s; m = atoi(p = strchr(p, ':')+1); a = atoi(p = strchr(p, ',')+1); s = atoi(p = strchr(p, ',')+1); printf(" param: max:%d, attack:%d, speed:%d\n", m, a, s); } } int main(void) { dump_testdata(&test_array[0]); dump_testdata(&test_array[1]); return 0; }
915 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:35:40 ] アンカー消えた。 >>914 は >>852 これくらいしか思いつかん。
916 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:57:05 ] >>907 ,910 どうもありがとう、なんとなくわかってきた なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね
917 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:03:50 ] C++使ってちょうど2年半の者です。 テンプレートメタプログラミングって とても難解そうで ほとんど学んでいないのですが、 例えば>>890 さんの場合ですとどうすればいいことになるのでしょうか。 どなたかコードを(boost::mplのような出来合いのライブラリを 使用せずに)書いてくださいませんでしょうか。 よろしくお願いします。
918 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:19:42 ] >>917 最近、C++を勉強し始めたからテンプレートを勉強していないんだけど こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ あぁ〜安心した
919 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:32 ] メタプロはライブラリ作者のためのものと言い切っても過言ではない 知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し 使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる
920 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:39 ] これは静的(コンパイル時)なのか動的(実行時)なのか とかを意識すると多少理解が楽になる
921 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:35:15 ] >>917 boost::mplを使えるようになれば自然と覚えられるよ。
922 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:13:45 ] こういうこと言うと否定されるのかもしれないけど TMPって出来合いのライブラリを使うプログラミングだと思う 自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね そういやTMPの本が出版されたんだっけ?
923 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:19:46 ] templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。 template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。
924 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 05:19:50 ] >>917 自信ないけどこんなんでどうか ttp://codepad.org/jyhjFg0S ところで、こういうのって、boolでやるのと struct true_tag {}; struct false_tag {}; とかを定義してやるのと、どっちがいいんだろ?
925 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 06:57:33 ] >>917 これでいいっしょ。 template<typename T, bool b> void foo_impl(const T &arg) { func_true(arg); } template<typename T> void foo_impl<T, false>(const T &arg) { func_false(arg); } template<typename T> void foo(const T& arg) { foo_impl<T, T::hoge_flag>(arg); } まあTMPなんて必要性が感じられなければ無理に使うような物でもないと思うよ。 付け焼刃の知識では早々使えるコードが出てくることもない。 何に使えるのかわかってからでも使い始めるのは遅くない。 まずは既存のコードでどう使われているのか観察することだな。
926 名前:917 mailto:sage [2010/03/15(月) 10:53:59 ] みなさんありがとうございます。 C++0xではテンプレートメタプログラミングをサポートするためだけにあるような 機能が増えると伺っておりましたので、そろそろ勉強し始めるときが 来たような気がしています。
927 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:28:21 ] >>922 そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。
928 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:17:19 ] >>927 お前はテンプレートメタプログラミングってなんだか理解しているのか? > 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに > 正しいコードが出るんだから、丁寧に作った関数テンプレートは > 使う側にとって大きなメリットがあると思う。 >>922 もみんなもテンプレートメタプログラミングの話をしているんだけど。。。
929 名前:928 mailto:sage [2010/03/15(月) 13:18:35 ] ああ、分かった。 >>927 はTMPがTeMPlateの略だと思ってた訳か。 これで文脈が繋がった。
930 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:19:03 ] ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。 ファイルは見つかるんですが、a.com/aa.jpg からだとファイル名はaa[1].jpgになっています。 zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで 見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?
931 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:08:24 ] 環境依存OKなスレで聞きなよ
932 名前:930 mailto:sage [2010/03/15(月) 17:21:02 ] >>931 もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。
933 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:05 ] それで?C++という言語の何を訊きたいの?
934 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:35:21 ] return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"
935 名前:930 mailto:sage [2010/03/15(月) 17:52:06 ] C++で作って詰まって短絡的に聞いてしまいました、すみません。 D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて \Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:01:30 ] _,,_ /´o ヽ ,.ィゝ l  ̄ヽ l l ヽ___ / ,,...---`ニニニ==、,,__ l / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三> | iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、 ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐' ヽ、`'''ー‐---‐'''´_,,...--‐'''´ `''ーッ--t_,r'''´ _/._/
937 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:33:35 ] >>935 そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ
938 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:56:25 ] >>930 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/l50
939 名前:930 mailto:sage [2010/03/15(月) 19:00:08 ] スレチですね。見当違いですみません…
940 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:13:17 ] >>925 二つ目のfoo_impl()はコンパイルエラー起こすだろ 関数テンプレートで部分的特殊化は無理
941 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:25:05 ] STLのvecterの配列に対してクイックソートを組んだんですが動きません ソース : codepad.org/YM2RidkL 47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください
942 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:55:20 ] 勘だけど 43、44行目あたりかな
943 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:01:47 ] 見た感じだと44行目か36行目のどっちかだな
944 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:03 ] 見てないけど44行目かな
945 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:14:34 ] どうみても44が--
946 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:42 ] >>944 > 見てないけど おいw
947 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:16:01 ] >>871 です >>876 ありがとうございます、一番参考になりました 近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます 何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます 最近はそういうの流行らないみたいですね もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは 噂で聞いてはおりますが…
948 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:47 ] >>941 添え字10のアクセス違反って出てるじゃん m_array[9]に値入れた後にjをインクリメントしてるんだろ >>947 は組み込み自体やった事なさそうな感じ
949 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:36:50 ] class hoge { const fuga &f; public: hoge() : f(fuga_sub()) { } }; const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?
950 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:37:50 ] fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから
951 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 05:58:00 ] >>948 ええ、組み込みは初めてです 使ってもいいライブラリはサンプル等あるんで問題ないんですが コンストラクタの初期化リストなんて初めて見ました トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw
952 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:58:42 ] >>949 初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。 規格の 12.2 p5 より。 > ... A temporary bound to a reference member in a constructor's ctor-initializer > persists until the constructor exits. ... その特別ルールが役に立つのはほぼ自動変数だけ。