1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32] C++ のジェネリックプログラミングの話をしましょう。 以下のスレッドを統合するスレです。 STLスレッド Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html 【C++】Boost使い集まれ! pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?) Generic Programming with C++ Template pc.2ch.net/tech/kako/1008/10085/1008593126.html 【C++】template 統合スレ -- STL/Boost/Loki, etc. pc2.2ch.net/tech/kako/1037/10377/1037795348.html 【C++】template 統合スレ -- Part2 pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち) 【C++】template 統合スレ -- Part3 pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち) 【C++】template 統合スレ -- Part4 pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち) 【C++】template 統合スレ -- Part5 pc5.2ch.net/test/read.cgi/tech/1091522597/ 関連スレ、その他リンクは >>2-5 あたりに。
796 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 20:27:48 ] >>795 意味無いじゃん。
797 名前:神゜ mailto:sage [2005/08/06(土) 20:49:53 ] そろそろ俺の出番か?
798 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 21:04:29 ] >>784 ベースクラスがテンプレート依存でなければ StringType,IntegerType は見えるが、そうでない場合は 795 のように書く必要がある。 実はずっと前の GCC で VC7.1 みたくエラーにならない時期が あったんだが、バージョン上げたらエラーになったんで仕様を 確認したことがあったのを思い出したよ。
799 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 23:17:54 ] >>798 2.95あたりは確かそうだったね
800 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:48:53 ] template<class A> struct Foo { template<class B> struct Bar { }; }; このBarだけを特殊化するのって、GCCでは template<>template<> struct Foo<int>::Bar<int> って書かなきゃならないんだね。 VC++7.1では template<> struct Foo<int>::Bar<int> で通るんだけど、これはバグなのかな?
801 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:55:26 ] >>800 どっちが規格に準じてるかによるね
802 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:00:26 ] >>800 14.7.3.17 より "If the declaration of an explicit specialization for such a member appears in namespace scope, the member declaration shall be preceded by a template<> for each enclosing class template that is explicitly specialized." template<> template<> ... と繰り返すのが正解っぽい。
803 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:10:09 ] >>800 gccを信じてそちらに合わせておけ。
804 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:27:08 ] >>800 gccのバージョンは何? g++ 3.3.5 だとそれ両方とも通るんだけど 新しいのは通らないのかな?
805 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:19:07 ] template <class T> typename enable_if<boost::is_integral<T>, void>::type foo(T t) {} で関数を定義したりできないのはわかるけど これでclassのコンストラクターを定義したりしなかったりを決めると コンストラクターに戻り値が定義されています と怒られる。何か方法ないのでしょうか? template <class T> class A{ typename enable_if<boost::is_integral<T>, void>::type A(T t) { } }
806 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:44:57 ] >>805 SFINAEは戻り値の型でやる方法と(デフォルト)引数の型でやる方法の2通りできて, コンストラクタの場合は戻り値の型を指定できないですから引数の型のほうでやります. template<class T> class T{ A(T t, typename enable_if<boost::is_integral<T> >::type * = 0){} }; こんな感じで.逆に演算子関数の場合は余計なデフォルト引数を指定できないので 戻り値型で,という感じになると思います.
807 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:38:01 ] enable_ifが何をするもんなのか、未だにわかんねえ。 てか、何年英語の勉強してもboostのドキュメントさえ読めない俺ってすげえよ。 よっぽど英語の才能が無いんだな。
808 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:41:04 ] テメェは自己紹介がしたいだけだろ 分からねぇんだったらイチイチ出てくんな
809 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:50:40 ] >>807 SFINAEによるオーバーロードセットのコントロールを簡単に 行うためのユーティリティ。 英語分からなくてもC++分かるんならひたすらソース詠めば 何となく見えてくる、かもよ。
810 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:53:46 ] >>808 なにキレてんのキミ。 相手以上の駄レス書いてたら意味無いのに。
811 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:59:07 ] 駄レスとかいってたら、ほとんどがそうだろw
812 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:00:10 ] ほとんどがそうならなおのこと 突然特定のレスにキレる理由が無いよ。
813 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:03:27 ] 自己顕示欲丸出しの厨房がウザイだけだろ まあ、どこにでもいるからいちいちキレるのもどうかと思うが
814 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:16:33 ] キレて説教するほうがよっぽど自己顕示欲激しいと思う。 世に言う自爆ですな。アホくさ。
815 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:17:52 ] www.boost.org/libs/utility/enable_if.html ここの「1.2 Background」は、何が問題だって言ってるんですか?
816 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:20:01 ] 説教がどう自己顕示欲につながるんだ??
817 名前:デフォルトの名無しさん [2005/08/07(日) 23:22:14 ] >>814 ワロス
818 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:29:27 ] >>816 キレるたびにいちいちスレ違いの書き込みするような奴が 自己顕示欲薄いって言い張る気?
819 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:34 ] enable_ifがわからんってののどこが自己顕示欲に繋がるのかもわからんけどな
820 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:49 ] >>818 藻前もキレてるじゃん あと煽り耐性なさ過ぎ いい加減スルーしろよ
821 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:31:47 ] >>815 いや,そこの部分は別に何かが問題だなんて書いてないです. 単にSFINAEというのがどう機能するか(そしてなぜそのような機能が必要なのか) を説明しているだけです.
822 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:15 ] 816が煽りには見えないけどなあ。 普通にズレてるだけで。
823 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:55 ] >>815 あっと,「もしSFINAEがなければこういうことが問題だよね」というのは書いてますけれど.
824 名前:デフォルトの名無しさん [2005/08/07(日) 23:35:03 ] >>822 分かったからもう出てくんな
825 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:40:11 ] 本日の推奨NG 「。」「顕示」「煽り」「キレ」 すっきりして(・∀・)イイ!!
826 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:07:36 ] expressional template VC.net2003だと、ちょっと複雑な式を書いただけで コンパイル通らない。 そういうものなの? gccなら通るのかな
827 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:12:44 ] >>826 その「ちょっと複雑な式」とやらを晒すとレスが付くかもしれない。
828 名前:デフォルトの名無しさん [2005/08/08(月) 03:35:21 ] >>826 現存する如何なるコンパイラでも通らない程複雑(広義の)なコードに問題ありに100円。
829 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 04:40:19 ] ネストが17超えるとか?
830 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 15:16:31 ] いろんな要素が混じってるので必ずしもexpressional templateが 原因でないのかもしれないけど boost::numeric::ublas::matrix & A(){return A_ } boost::numeric::ublas::matrix & B(){return B_ } B() = prod( A(), A())*3 + B() + .... こんな感じかな.全部はさらせないのですまそ
831 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 01:41:27 ] >>830 エラー貼ったがいいよ もし膨大なら 再現するコンパイル可能な最小のコードを貼って
832 名前:831 mailto:sage [2005/08/09(火) 01:45:25 ] >コンパイル可能な おっとコンパイルは通らないのか >あなたがコンパイル通らないことを理不尽に思う に訂正 ようするにテストする側の身になってコードを 貼ってください
833 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 11:45:51 ] >>830 >こんな感じかな.全部はさらせないのですまそ じゃあ、他の人にエラーの原因を調べてもらうのも諦める事ですな。 証拠不十分なまま、証言台に立つような物ですぞ。
834 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 08:39:28 ] だれもいない
835 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:28:20 ] ホントにだれもいないのかよ
836 名前:デフォルトの名無しさん [2005/08/20(土) 20:39:26 ] いねーよ
837 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:40:28 ] 質問やら話題があれば人は自然と集まってくる。
838 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:52:57 ] おまえら ”てんぷれーと”にだまされてないか? ”しーぷらぷらのてんぷれーと”って結局あれだよ。 中途半端。 そう中途半端。 LISPに比べたら。 全然読み易くならない。 いろんな括弧であふれてLISPの方がまだサルのように読みやすい。 まあここにタムロしてるおまえらの言い分は判ってるよ こうだろ、静的カタカタ型が重要なんです! LISPじゃすぴーどでないよプププ とかな。 ばーか。 カタなんかより柔軟性なんだよこのご時世はよ カタカタうるせーのなんのって、笑うわ。 C++考えた奴みたいにハゲろ 全員
839 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:59:39 ] 確かに、「ネイティブコード吐く言語じゃないと速度が」 とか必死に言ってる奴に優秀なプログラマはいないな。
840 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:10:42 ] しーぷらぷらの処理系。 てんぷれーとバグだらけ。 笑うわ。 いったい何年てんぷれーとやってんだよ おまえらがべんだーの修正待つあいだに おれLISPで新しいマクロどっさり作る 生産性バカたけぇーわLISPはよ LISPはカタないからすぴーどでないよプププて、 そりゃ頭がかてえ証拠だな。 そんな奴は引退したほーがいいんじゃねーかなあ LISPにカタないなら組み込めよ、ハゲども ぶーとすとらっぷとか考えろよ わかるか?ぶーとすとらっぷって。 しーぷらぷらにはそんながいねんはないかもなあ。 最適化なんかやりやすいなーすいすいいけるぜ こんすの海の中にいると不満なんてすぐ解消する それがLISP。 まあ頭のかたいカタカタ野郎は やっぱりC++考えた奴みたいにハゲろ 全員
841 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:16:51 ] >>839 よりは優秀だけどね。
842 名前:マイク ◆yrBrqfF1Ew mailto:sage [2005/08/20(土) 21:31:32 ] C++をしーぷらぷらなんて言うのは無能。
843 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:59:52 ] C++でLisp系の俺言語&処理系作るのが最近の俺の趣味なんだが、 なんかこいつの仲間と思われたくないな、恥ずかしくて。
844 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 22:59:08 ] >>842 シープラスプラス? それともシーたすたす?
845 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:33:28 ] しーいんくりめんと
846 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:43:58 ] C++ 後置ということは、まだ本当のC++にはであてないわけだ
847 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:45:24 ] C++には出会えている ++Cに出会えてないだけ
848 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:37:45 ] 838は、C++のテンプレートが読みにくく、 コンパイラのバグのことも分かっていて、 C++作った人物についても詳しいようだな
849 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:48:03 ] Schemeの純粋指向にはあこがれるけど、Lispはどうでもいいや。 継続は面白いな。 >LISPはカタないからすぴーどでないよプププて、 型が無いと遅くなるつうのは初耳ですが、どこの情報?
850 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:06:13 ] >>849 VBのバリアント型みたくデータ側に型情報があるから オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。 型判定に値の取り出しとか最低でもCの3倍以上のコストが掛かる。 Rubyが遅いのもこれがかなり影響してる。
851 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:09:17 ] でも日本語は不自由なようだ。
852 名前:851 mailto:sage [2005/08/21(日) 01:09:45 ] >>838
853 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:25:23 ] > オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。 随分ダサい実装ですね。
854 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:07 ] そのダサイ実装を越えたところに桃源郷が
855 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:43 ] ももげんごう?
856 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 12:12:15 ] ももげんごう(←なか変換できない)
857 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 14:42:55 ] 桃源郷=Xanadu キサナドゥ
858 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 00:38:44 ] >>850 正直、有名なコンパイラならそんなださい実装は少ないよ。 Common Lispには型指定の構文があるくらいだし。
859 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 09:18:30 ] 数値計算したい人は 速度気にしないならlistでなくてMatlab使う
860 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:06:35 ] >>858 CLOS基地外氏ね スレ違いだし
861 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:34:43 ] だれもいないからとか言うから
862 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 16:29:46 ] 人稲杉なので、チラシの裏 boost::bind は、bind( f, _1, _2, a, b, _1 ) を行うことで、 func::return_type ( A1 & a1, A2 & a2 ) というファンクタを返すけど、 この _1 や _2 を、_decimal や、_text、_float のような書式指定プレイスホルダに 置き換えて、以下のようにすれば、タイプセーフな printf が出来るなと 考えたことがあった。 function< void( int ) > f = format( cout, "a = ", _hex, endl ); // ↑ cout << "a=" << %x << endl; と同じ事を行うファンクタを返す。 f( 10 ); // cout << "a=" << hex << 10 << endl; f("aaa"); // コンパイルエラー 上の形とは違うけどその思想に基づいて実際に作ってみたことがある。 でも結局実用では (w)sprintf しか使わなかった。勉強にはなったけどね。 template プログラミングは楽しいけど、冷静なるとしなくていいことまで テンプレート化してたりしていることがあるので気をつけないと。
863 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 17:12:40 ] >>862 > 冷静なるとしなくていいことまでテンプレート化してたりしていることがある 昨夜、そんな関数テンプレートを必死で非テンプレート関数に直してた・・・。 数日前に必死で関数テンプレートにした箇所だったのだけど・・・。
864 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 12:24:27 ] template<typename X_TYPE> void xxx(X_TYPE x) {} として型の自動認識の手間減らしは多用するな
865 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 13:32:40 ] そうね。時々やる。いっそのこと型を書くのはオプションにして MLみたいに型推論してくれればいいのにと思う。
866 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 17:50:00 ] C++ 0xだとそんな機能が追加されるとかされないとか。
867 名前:デフォルトの名無しさん [2005/08/28(日) 09:36:27 ] テンプレートがちんぷんかんぷんでまったく理解できない私に 理解できるようになる方法を教えてください。まじで。
868 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:02:49 ] 引数の型を使うときに決められるんだよ。
869 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:35:27 ] >>867 騙されたと思ってstd::min()でも使って味噌。
870 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 13:22:51 ] せめてstd::vector くらい使わないとありがたみ沸かないだろう。
871 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 18:04:02 ] >>867 つ[C++ Templates(英文)]
872 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 06:58:30 ] STL バンザイ
873 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 21:56:02 ] STLとboostが無かったら俺C++使いつづけて無かったよ。
874 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 22:30:29 ] 俺もそうだ。
875 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:21:09 ] 会社でtemplate使うなって言われたんだけど… 何故?
876 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:24:13 ] 会社で使いこなせるヤシがいないからと邪推
877 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:31:06 ] 代わりにLISP使え もっと困るかもな へへ
878 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:19:35 ] >>875 それは、あなたが馬鹿だからです。
879 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:26:37 ] お前だけは使うなって言われたなら そうかもしれないけどさ
880 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:13:41 ] >>875 まともな会社にうつるべし
881 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:55:32 ] >>875 会社に聞け。 ここで聞くようなやつは>>878 に決定。
882 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 10:02:04 ] >>881 なんでそんな必死にこの話題にフタしたがるの? コンプレックスでも刺激された?w
883 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 11:09:31 ] >>882 頭、大丈夫か?
884 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 14:45:37 ] VC6のプログラム保守してるとかじゃないのか>875
885 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 22:33:39 ] >>883 大丈夫だよ。 質問に答えられない誰かさんの頭は大丈夫じゃないみたいだけど。
886 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 03:17:12 ] ・移植性重視 ・扱える開発者が少ない or メンテする人が固定とは限らない のどっちかだろうねえ 後者の事情のほうが多いと思うけども
887 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 02:16:23 ] 管理職の団塊世代が、ピュアなC以外理解できないとか
888 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 22:28:28 ] 名前空間→記述が冗長すぎる テンプレート→制限が多すぎる クラス→継承が可読性を悪化させる その他→コンパイル時間が長すぎる
889 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:39:18 ] C++→俺が解からない
890 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:45:15 ] 俺が解からない→みんなも解からない
891 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:04:02 ] >>886 >移植性重視 templateって移植性下がるの?
892 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:33:11 ] 例えばGCCと心中するつもりならGCCで動けばOKって人もいるでしょ
893 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:46:27 ] >>891 ある程度ISO C++に準拠したコンパイラがない環境には移植できなったりだとか。
894 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 03:16:30 ] 少なくとも、vc7.1とgccの両方で動くテンプレートくらい書けないと 話にならないと思うけど。
895 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 12:53:08 ] VC7.1とgcc3.3以降で動くテンプレート書くのは簡単だろ、どっちもほぼ100%標準準拠なんだから。 むしろVC6とかgcc3.2とかで動くか動かないか判断する方が難しいと思われ。
896 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:14:28 ] >>895 VC6とgcc3.2以前はもうあきらめた。 というかエラーメッセージすらとんちんかんな時があるのが頭痛い。 昔の仕事のプロジェクトコードのメンテでちょっとしたテンプレート書いてとかで 引っかかると泣きたくなる。