- 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
|

|