1 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 23:10:49 ] The C++ Standards Committee www.open-std.org/jtc1/sc22/wg21/ wikipedia ja.wikipedia.org/wiki/C%2B%2B0x C++0x pc11.2ch.net/test/read.cgi/tech/1149440647/ C++0x 2 pc11.2ch.net/test/read.cgi/tech/1191842951/ C++0x 3 pc11.2ch.net/test/read.cgi/tech/1204808027/ C++0x 4 pc11.2ch.net/test/read.cgi/tech/1214407525/
321 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 00:14:40 ] クラス作る時にコンセプト使って InputIterator my_iterator{/*...*/}; とかやって要件満たしてなかったらエラー出してくれるみたいな使い方ができればよかったのに
322 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 00:16:33 ] 表記が違うだけで出来るやん
323 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 00:27:12 ] いや、そりゃやろうと思えばできるけどさ こんな風になるのかな class my_iterator{/*...*/}; template<InputIterator T> class InputIteratorChecker{}; static_assert(sizeof(InputIteratorChecker<my_iterator>)); めんどくさくね?
324 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 00:29:53 ] >>315 主旨だけシンプルに書きましょう。 わめいて逃げてるようにしか見えませんw
325 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 00:49:16 ] >>323 Only required, > requires InputIterator
326 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 01:02:42 ] >>325 それでどうやって簡単に書くんだ? requiresってテンプレートとコンセプトの中でしか使えないだろ
327 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 01:13:26 ] my_iteratorは、template<〜> iteratorとは無縁のクラス、 まったく別のsignatureってわけですか? だったらconcept_map書くしかないですね。
328 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 01:18:10 ] めんどくさい誤解招いてるみたいだからInputIteratorやめる auto concept HasFoo<class T>{ void foo(); }; があるときに HasFoo Hoge{void foo(){}}; //OK HasFoo Fuga{}; //NG とかできたらいいなー、というのが>>321 の趣旨
329 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:01:42 ] fooにT型の関与なしかあ。 auto concept HasFoo<>{ void foo(); }; template<> class Hoge { void foo(); }; template<> concept_map HasFoo<Hoge> { void foo() {} }; 〜 Hoge<> 〜 でいいのかなあ。
330 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:14:42 ] めんどくさいなぁ やりたいことはただ自作クラスがHasFooコンセプト満たしてるかどうかチェックしたいだけだってのに チェックするためだけにテンプレート化すんの? 馬鹿げてる
331 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:23:59 ] これでいいじゃん template<> class Hoge { void foo(); requires HasFoo<Hoge>; };
332 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:23:59 ] auto concept HasFoo<typename T>{ void foo(T); }; だと、 template<typename T> class Hoge { requires HasFoo<T> void foo(T) {} } って書けるけど。 template<> class Hoge { requires HasFoo<> void foo() {} } はいけるかどうかわからん。もう一回ドラフト読まんと。
333 名前:332 mailto:sage [2009/02/21(土) 02:26:50 ] 間違えた。 class Hoge { requires HasFoo<> void foo() {} } これは駄目だった。 >>331 ああそだね。
334 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:28:05 ] >>332 それ以前の問題として HasFooは簡単なコンセプトだからいいけど これがもし10個の型名と20個の関数を要求するコンセプトだったら Hogeの型名と関数全部にそのrequires付けて回る気か? >>323 の方が楽だわ
335 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:31:08 ] 直接こう書ければなんの問題もないのにな class Hoge { void foo(); requires HasFoo<Hoge>; };
336 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:44:18 ] C++ってほんとに糞言語ですね☆
337 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 02:45:25 ] C++がwadlerとかにボロ糞に貶されるところを見てみたい
338 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 03:30:09 ] class Hoge : public HasFoo<Hoge> { void foo(); }; こう書かせろよ。めんどくさいな
339 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 03:53:18 ] >>320 配列で使えんやん
340 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 08:56:53 ] >>338 class Hoge requires HasFoo { void foo(); }; ならあり得るかも。
341 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 12:08:31 ] >>339 concept_map ?
342 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 18:07:11 ] >>341 concept_mapってsignatureのようなことできる様になるの? 便利やね。 struct A { //・・・ void Method(); }; struct B { //・・・ void Method(): }; signature Sig { void Method(); }; Sig array[]={new A(),new B()};//継承関係の無いオブジェクトを代入 array[0].Method();//それぞれ正しいメンバーが呼び出される
343 名前:デフォルトの名無しさん [2009/02/21(土) 20:13:06 ] ↓がg++4なら通るけどVC9などintがint&に変えられなくて駄目といって通らない。 これって自分何か勘違いしてますか?VC9のバグってことはありませんか? struct MyClass { int value; void set_value(int v) { value = v; } int get_value(void) const { return value; } }; vector<shared_ptr<MyClass> > v; ...vに適当に要素を入れる... for_each(v.begin(), v.end(), bind(&MyClass::set_value, _1, bind(&MyClass::get_value, _1))); // 駄目子ちゃん
344 名前:343 mailto:sage [2009/02/21(土) 20:14:24 ] あ、bindは<functional>のstd::tr1::bind、_1はstd::tr1::placeholders::_1です。
345 名前:343 mailto:sage [2009/02/21(土) 20:21:13 ] スレ違いな気がしてきた。C++スレへ行きます。すみません。
346 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 15:49:24 ] さあもう一度アインシュタインでなにか例え話してみれば?
347 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:01:38 ] 誰もアインシュタインで例えたことなんて無いと思うが。
348 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:47:07 ] 誰かアインシュタインclass作れよ
349 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 18:35:28 ] __declspec(dllimport) class Einstein * __stdcall BangEinstein(void); class Einstein *Albert=BangEinstein();
350 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 18:55:22 ] assert(E==mc2)
351 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 19:19:11 ] アインシュタインタンジェント
352 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 10:05:15 ] もう拡張メソッドも組み込んじゃえよ
353 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 19:54:44 ] C++に拡張メソッドは色々と面倒で厄介な問題があるから無理
354 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 23:39:28 ] もうちょっと説明クレ 抽象的な言い方では判らないよ
355 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:23:27 ] ヒント:拡張メソッドはメンバ関数もどきを提供するんだから 当然ポインタから->を通して呼ぶこともできるべきだよな、C++的に考えて ここから思いつく面倒ごとに思いを馳せれば現実的じゃないという結論には簡単にたどり着く
356 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 05:30:40 ] >>355 テンプレートメンバ関数の特殊化と同じような方法で実装すればいいんじゃね? あれも新しいメンバ関数をクラスの定義の外で作ってるわけだし。
357 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 10:13:33 ] なんか演算子余ってないの? p->>func() を func(p) の糖衣構文として扱うとかそんなんでいいんだが
358 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 10:17:34 ] >>356 特殊化はシグネチャを変えているわけじゃない。
359 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 15:44:17 ] >>357 ->* とか? でも (p->*func)() みたいに括弧が必須なのが面倒。
360 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:49:01 ] >>359 肛門を指してるように見えた俺は逝ったほうがいいんだろうな orz
361 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 19:02:12 ] )*(
362 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:53:49 ] >>352 拡張メソッドのメリットって何?
363 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 01:13:23 ] >>361 むしろ梅干し食べてる感じ
364 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 03:35:03 ] >>356 難しく考えすぎ 普通に第一引数がthisでそれ以外が普通の関数の定義と同じようになるようにすれば良い。 たとえば class foo {}; // 定義 class foo { int bar(int baz) { return baz; } }; // 拡張メソッド(C#風) って書いたら int foo_extended_method_bar(foo* this, int baz) { return baz;} って書くのと同じようになるようにすればいい。 でも継承したらどうなるかとかは知らん >>362 使ったこと無いからわかんないなぁ rubyのサンプルコードで良く見るけど
365 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:00:55 ] >>364 なにその生産性の低い記述は。
366 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:13:32 ] あくまで後から擬似的にメンバメソッドを追加できるようにするシンタックスシュガーでしょ。 あんまりいい例じゃないけど、なんでこの行列クラス、固有値求められないんだよ…ってときに: #include "matrix" // class Matrix; #include "eigenvalues" // vector<double> eigenvalues(const Matrix& this); Matrix m; auto es = m.eigenvalues(); // eigenvalues(m); と同等 Matrix* pm; pm->eigenvalues(); // eigenvalues(*pm);
367 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 11:11:44 ] 比較的簡単な処理の流れはメソッドチェイン出来ると楽ってだけかと ただC++だと例外を軽く使えないからエラー処理をどうしようってことでMaybeモナドが欲しくなる
368 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 12:10:37 ] >>366 例が悪すぎます
369 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 12:45:38 ] >>366 Matrixをテンプレートの型パラメータで渡したときなんか拡張メソッドの定義includeの読み込み順で拡張メソッドが適用されたりされなかったりするのかな
370 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 15:11:17 ] oven(egg)のpipableは拡張メソッドっぽい
371 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:56:06 ] ソースが短くなるだけで、生産性の低い、動きがトロい、そんなバイナリーができそうだな。 現状のSTLも遅いし。
372 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:06:19 ] 拡張メソッドの解決は動的ポリモルしなければコンパイル時に行うことができるんでそうとも言いきれない
373 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 22:40:52 ] 第一引数を前に出す、単なる糖衣構文だから、バイナリが遅くなるなんてことはないわ
374 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:12:40 ] C++だとただの糖衣じゃ済まないから注意しないとオーバーヘッドはかかるな
375 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:15:33 ] operator.ぐらいの糖衣
376 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:47:58 ] generic functionがあるのに必要ですかね。
377 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 01:09:52 ] >>372 それが問題なんでねぇかい テンプレートメンバ関数はその辺上手く逃げたよなぁ
378 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 05:05:59 ] 普通のオーバーロード解決でなんか問題あるんか。
379 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 11:52:07 ] >>378 kwsk
380 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:18:24 ] objがfuncメソッドを持ってなくて、スコープにfunc拡張関数がある場合、 obj.func(args) を func(obj, args) と字面上同義みなすってことでは?
381 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:20:17 ] generic functionがあるのに必要ですかね。
382 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:35:21 ] 必要です。目的が違います。
383 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:39:08 ] ほとんど変らないんじゃない? virtualにならないんだし。
384 名前:デフォルトの名無しさん [2009/02/26(木) 13:44:28 ] generic functionて何。
385 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 18:48:11 ] あるオブジェクトに対して行う処理を まずオブジェクト名から入力できるとインテリセンスとかで楽できるんだよね 候補が狭まるから
386 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 20:08:43 ] あほくさ
387 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 22:52:27 ] 今時インテリセンスも使いこなせない奴がいるのか・・・
388 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 22:56:03 ] 0xの次で多重ディスパッチが入れば一緒に入るんじゃないかい>拡張メソッド
389 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:18:24 ] 汎関数の多重ディスパッチは既にある。
390 名前:デフォルトの名無しさん [2009/03/15(日) 11:12:39 ] おっぱいを大きく見せたくて多重ブラジャーする美少女中学生
391 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 12:53:17 ] 久々に上がってるんで見に来てみたら… この前、時間が作れたんでようやくmailing2009-02を少し読めた。 久々の単独署名のDouglas Gregorの"Concepts and Ref-qualifiers"、 いやーやはりRvalue Referencesは難しいですね。 それからDouglas GregorってAppleに就職したんだな。(2008/10) 古くはIOKit、今はWebKitとC++結構使ってるからな。
392 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:36:14 ] 0xって本当に0xに出せるの?
393 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:46:12 ] 残念ながら1xがほぼ決定
394 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:47:12 ] でも未完成のまま強引に0xに出しそうな気もする やめてほしいけど
395 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:50:09 ] ISOの手続きのスケジュールの都合で無理なのでは? それがなかったとしても十分09に間に合いそうもないが。
396 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 16:03:26 ] もう出しても意味ネーよ。
397 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 16:24:56 ] >>391 auto concept HasAssign<typename T, typename U> { typename result_type; result_type T::operator=(U) &; // ←Rvalue reference! } ワロス
398 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 18:27:34 ] >>395 そうきいている
399 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:34:43 ] autoっぽいものを現行のC++で実現するマクロってあったような気がするんですがマクロ名を知りませんか
400 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:56:24 ] BOOST_AUTOのこと?
401 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 22:44:53 ] gccのtypeofかなぁ?
402 名前:デフォルトの名無しさん [2009/03/21(土) 14:58:40 ] 僕は言語仕様の問題のほか、現実的な理解者とコンパイラがいつ現れるかも 気になる。現行のSTLやBoostですらコンパイルエラー、ワーニングが長すぎて 解読困難なのに、これ以上になるのかと思うと気が重くなる。
403 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:59:11 ] しまった・・・sage忘れた・・・
404 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:03:06 ] C++0xのconceptにはエラーメッセージを簡易にする目的もあります。
405 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:03:38 ] 俺を含む凡人以下からすれば 「まずはまともな処理系を出してくれ、話はそれからだ」 だからな WGにいる仕様書だけでコードを書いてあーだこーだ議論してる奴等は化け物に思えてくる
406 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:06:55 ] >>404 一般的な開発者がその恩恵を受けられるのは、 どんなに早くても2012年頃かと思われますw
407 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:12:33 ] concept については厳しいだろうけど他の機能についてはちょこちょこ実装されつつあるじゃん。
408 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 17:13:32 ] 可変長テンプレートとか右辺値参照とかばっかり先行してて 可読性を良くする機能はことごとく後回しにされてるけどな
409 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 17:16:56 ] 可変長テンプレートはありがたいだろ。 TEMPL1(X) TEMPL2(X1, X2) TEMPL3(X2, X2, X3) : TEMPL20(X1, X2, X3 .. X20) とかもうイヤだよ。
410 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 17:24:11 ] そりゃそうだけど、ソースが読みやすくなる訳じゃないじゃん エラーメッセージは多分もっとわかりにくくなるだろうし
411 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 17:27:25 ] 可変長テンプレートが「可読性を良くする機能」ではないとすると、 後回しにされてる機能って何のこと言ってるの?
412 名前:409 mailto:sage [2009/03/21(土) 17:29:11 ] >>410 そりゃまあ一般論としてはそうかな。 ただ俺は馬鹿だからか、機械生成しなかったのが悪いのか、 5引数のやつだけ書き間違えて大填まりしたことあるわ。 気づくわけないっての
413 名前:デフォルトの名無しさん [2009/03/25(水) 03:24:35 ] www.open-std.org/jtc1/sc22/wg21/ News 2009-03-24: The 2009-03 post-Summit mailing is available News 2009-03-24: The C++ Standard Core Language Issues List (Revision 62) is available News 2009-03-24: The C++ Standard Library Issues List (Revision 63) is available
414 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 12:21:54 ] というわけで最新のWorking DraftはN2857ですか。
415 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 18:44:11 ] あんまり面白くねーな ラムダ関係がボロボロで全面書き直しって事くらいか あと日本からのコメントrejectされまくり
416 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 21:07:56 ] 結局ラムダ式って Monomorphic なやつだけしか入らんの? 型名書くのだりーよ… 結局 Boost.Lambda のほうが便利じゃんってオチ?
417 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 05:20:03 ] >>416 何言ってるのかわからん。 Boost.Lambda のどんな用法のことを言ってるの? C++0x のラムダ式で置きかえらない用法があるってことなんだよね?
418 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 08:58:21 ] >417 単に引数の型書くのが面倒という話では? _1 + 1 [] (int n) { return n + 1; } もともともラムダ式の提案では引数の型を指定しないでよいものも込みだったんだけど、 分割して型を指定するものだけ先に持ってきたのが Monomorphic なラムダ式のはず。
419 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 09:13:54 ] [] (auto x) { (ry }とか[] (x) { (ry }とかでできないのかな?
420 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 11:06:48 ] >>417 Boost.Lambda は多相じゃん。 (_1 + _2)(1, 1) // -> int 2 (_1 + _2)(1.0, 1.0) // -> double 2.0 単相にして保持したければ function<double(double, double)> f = (_1 + _2); f(1, 1) // double 2.0 とかもできるし。 ちょっと調べてみたら n2529 で、 (n2329 にあるように higher implementation cost なんで) "We do not propose generic lambda functions for C++0x." って書いてあるな… これはダメっぽい。
421 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 12:35:25 ] range based algorithmの採用も却下されたことだし まだまだboostの役目は終わらないということだな