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/
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. ... その特別ルールが役に立つのはほぼ自動変数だけ。