- 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/
- 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 ]
- えっ
|

|