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/
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 ] 俺も要らないと思うわ