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 あたりに。
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以前はもうあきらめた。 というかエラーメッセージすらとんちんかんな時があるのが頭痛い。 昔の仕事のプロジェクトコードのメンテでちょっとしたテンプレート書いてとかで 引っかかると泣きたくなる。
897 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:25:22 ] >>894-895 まるで、複数コンパイラで有効なテンプレートを書くのが上級者であるかのような言い方だな。 そういった汎用性のあるテンプレートは入門者レベルの機能しか使ってない。 君らは、入門者レベルのテンプレートしか書いたことないんだろ?
898 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:31:55 ] スレの存在を否定するような行為が、目下のベストな対処法 「技巧に走らない」
899 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:04:38 ] >>897 > であるかのような言い方だな。 印象だけでものを書く場合、その印象がトンチンカンだと 残りの文章がすべてトンチンカンになるから今後は気をつけな。
900 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:25:57 ] シンプル伊豆ベスト
901 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 15:15:35 ] >>897 「入門者レベル」とか「汎用性のある」とか、 自分が「上級者」じゃない事がバレバレなんですがw まぁ、恥の上塗りだけはしないようになw
902 名前:名無しさん@そうだ選挙に行こう [2005/09/10(土) 18:43:40 ] >>888 つまり、templateに限らずC++は糞だって事で包茎?
903 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:37:56 ] ていうかお前が包茎。
904 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:45:33 ] 24時間テレビ C++ は地球を救う
905 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 20:09:37 ] >>902 ,904 んなこたーない。
906 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 22:11:14 ] >>894 は馬鹿だな。
907 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 01:31:57 ] 894は、VC以外でも通るように、typenameちゃんと書けとか その程度の意味じゃねえの?
908 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 05:40:17 ] 言語仕様が複雑すぎて処理系が追いつかないのは本末転倒 言語仕様満たしてから最適化とかやれよ馬鹿ベンダーはよ 現実逃避してんじゃねーよ
909 名前:名無しさん@そうだ選挙に行こう [2005/09/11(日) 07:05:25 ] ヒント:需要と供給
910 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:16:30 ] つまりDelphiが最強ということになるな。
911 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:37:08 ] Delphi知らないんだけどtemplateみたいなのあるの?
912 名前:名無しさん@そうだ選挙に行こう mailto:sagen [2005/09/11(日) 09:44:31 ] あるか!
913 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:52:58 ] なぜ怒る・・・。 そこがDelphi信者のコンプレックスなのか?
914 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:57:55 ] でもDelphiってすごいよね 一代でここまでメジャーになった言語パッケージってないでしょ それともPascalの下積みがあったから?
915 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:18:13 ] >>914 世間ではC#の方がメジャーだと思うがね。
916 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:20:04 ] C#は単なるM$の宣伝力だと思うけど
917 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 11:13:26 ] >>916 CとかC++から名前の連続性もあるしね。
918 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 12:07:50 ] C#なんて使って製品開発とかしてる香具師っているの?
919 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 14:40:54 ] 天下のM$がVBで真似したぐらいだからな 当時はRADは斬新な開発環境だった
920 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 15:18:44 ] Delphi使いこそプログラマの頂点ということか。
921 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:34:19 ] Delphiが当初からMS謹製であったならば、VBだ、MFCだ、ATLだ、WTLだ、 STLだ、.Netだ、C#だ、C++/CLIだといったことで右往左往することもなく 10年間一貫とした言語体制、RAD環境、爆速コンパイル、コンポーネント化 による高い生産性等々を皆が維持・共有できたかと思うと残念でならないよ。
922 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:49:55 ] C#って、Delphi作った香具師が理想の言語として設計したんだろ。 Delphi信者御苦労様w
923 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 18:34:04 ] まだDel厨いたのか そろそろ博物館に行けよ
924 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 20:14:45 ] 博物館の恐竜が一緒に浮かれて踊ったぜ
925 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 23:35:20 ] >>921 STLだけその中で異質だな。
926 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 09:47:06 ] 予想通り嫌Del厨が暴れることになったか・・・
927 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:54:51 ] つか、スレ違いうぜぇですよ?
928 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:58:56 ] >>924 子門乙
929 名前:デフォルトの名無しさん [2005/09/14(水) 15:45:52 ] template< typename char_type, tepename char_traits > std::basic_ostream< char_type, char_traits >& operator<< ( std::basic_ostream< char_type, char_traits >& stream, const int& value ) { stream << "value = " << value << endl; return stream; } この関数内で文字列リテラル"value = "を char_type がcharなら、"value = " char_type がwcharなら、L"value = " にしたいんですが、どうしたら良いでしょうか?
930 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 16:12:57 ] >>929 テンプレートの特殊化か、オーバーライドで解決させる。 ex) inline char const * choice( char const * s, wchar_t const *, char ) { return s; } inline wchar_t const * choice( char const *, wchar_t const * s, wchar_t ) { return s; } stream << choice("value=",L"value=",char_type()) << value << endl;
931 名前:929 mailto:sage [2005/09/14(水) 16:31:48 ] >>930 #define literal_str( char_type, str ) choice( str, L##str, char_type##() ) 付きで採用しますた。 ありがとうございました。
932 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 17:21:04 ] >>931 二番目の##は余計。
933 名前:929 mailto:sage [2005/09/14(水) 21:31:05 ] だからなんだよこのタコ助!
934 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 22:41:20 ] 確かに余計だな。
935 名前:929 mailto:sage [2005/09/15(木) 00:04:09 ] >>933 >>929 の著作権は私にあります。 なんなら出るとこ出ても・・ と思いましたがきっと>>933 は 私にインスパイヤされて誕生した新種なんでしょう。 今回はかんべんしてやります。
936 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 11:53:02 ] template <class T> void f1(T t) { f2(t); } void f2(int) {} int main() { f1(1); } というコードは正しいのでしょうか? VC7.1 ではコンパイル可能で comeau ではコンパイルできません。
937 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 12:50:56 ] >>936 comeauだとなんてエラーが出るの?
938 名前:636 mailto:sage [2005/09/15(木) 13:09:16 ] >>637 identifier "f2" is undefined detected during instantiation of "void f1(T) [with T=int]" というエラーです。strict mode のみのようです。 ちなみに、ユーザ定義型の場合は期待通りにコンパイルできました。 template <class T> void f1(T t) { f2(t); } struct a{}; void f2(a) {} namespace adl { struct a{}; void f2(a) {} } int main() { f1(a()); f1(adl::a()); } このコードはコンパイル成功。
939 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:23:18 ] >>936 gcc3.4.4(MinGW) で、-Wallで通る。
940 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:26:00 ] >>938 プロトタイプ宣言したら?
941 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:31:54 ] >>938 f2()のプロトタイプ宣言が必要っぽい。
942 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 16:28:36 ] Incompatibilities Between ISO C and ISO C++, David R. Tribble david.tribble.com/text/cdiffs.htm#C90-impl-func ・ Implicit function declarations > C++ does not allow implicit function declarations. It is invalid to call a function > that does not have a previous declaration in scope. > > C99 no longer allows functions to be implicitly declared. > The code above is invalid in both C99 and C++.
943 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 17:47:26 ] >>936 標準の (14.6.4.2/1) をそのまま読む限りでは, unqualified name lookup として 解決される名前は point of definition の文脈のみが考慮されて, associated namespaces を用いた名前解決(要するにADL)では,point of definitionと point of instantiation の双方の文脈が考慮されるみたいですね.なので, >>936 の f1(1) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合, unqualified name lookup では f2 の呼び出しを定義している場所(point of definition) からは f2 という名前は解決されないので失敗し,さらに f2(t) は int を引数とした 呼び出しのために associated sets of namespaces and classes も空 (3.4.2/2) の ため,ADL 経由でも f2 は見つからずに,結果 f2(t) という関数呼び出しに対応する 名前の解決が失敗する. 一方で,>>938 の f1(a()) 及び f1(adl::a()) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合,>>936 と同様 unqualified name lookup による名前解決は 失敗する.ところが,a 及び adl::a はユーザ定義型で,各々グローバルと adl が associated namespace になる.この場合,f2(t) という呼び出しが定義されている 場所 (point of definition) と f1 がインスタンス化された場所 (point of instantiation) 双方の文脈が名前解決において考慮される.結果, point of instantiation の文脈で void f2(a) と void adl::f2(adl::a) が visible のため,これらの名前解決が成功する. と,こういう感じだと思います.ちなみに VC++7.1 の挙動は,dependent name だろうが non-dependent name だろうが,ADL 経由だろうがなかろうが,全て point of instantiation の文脈も考慮するという実装になっているための結果で, これは標準に準拠した挙動ではないです.
944 名前:943 mailto:sage [2005/09/15(木) 17:49:27 ] あ,すいません.長々と書きましたけれど結論としては, 936のコードは(標準に準拠していないという意味で)正しくないと思います.
945 名前:936 mailto:sage [2005/09/15(木) 22:07:49 ] >>943 なるほど。 実体化の時点で名前の解決を行っても、 実体化の時点の文脈が考慮されるとは限らないんですね。 皆様、ありがとうございました。
946 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 22:41:25 ] template<class T> class Foo { public: ...; private: class Bar { public: ...; bool operator()(const Bar& l, const Bar&r) const; private: T m_value; int misc_info; }; std::multiset<Bar, Bar::Comp> m_bars; }; m_bars の先頭・末尾に番人(misc_value などは他のメ ンバと同様にアクセス可能にしたもの)を導入したいの ですが、どういうアプローチで作れば良いでしょうか?
947 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 01:33:46 ] >>946 undeclared identifier `misc_value'
948 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 09:43:59 ] >>946 テンプレート関係ないやん。
949 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 16:56:08 ] STLportではコンパイルできるけれど、 g++のSTLではエラーが出てしまうようなコードってどんなものがあるでしょうか? vectorやstringくらいしか使ってないんですが、コンパイルでエラーが出ます。。
950 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:25:59 ] エラーメッセージ書かん奴には答えない
951 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:33:35 ] >>949 氏ね!
952 名前:デフォルトの名無しさん mailto:age [2005/10/05(水) 16:55:29 ] template<int num, int count> struct power{ enum { value = power<num, count-1>::value * num }; }; template<int num> struct power<num, 1>{ enum { value = num }; }; template<int num> struct power<num, 0>{ enum { value = 0 }; }; template<> struct power<0, 0>{ enum { value = 0 }; }; ∋oノハヽo∈ ( ´D`) <テンプレート ♪ で、計算♪計算♪ age♪ age♪ (つ┳9 (_)┃_) ━§━ § ⌒ヽ〃⌒ヽ〃 int main() { //2の8乗 cout << power<2, 8>::value << endl; return 0; }
953 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 18:45:40 ] >template<int num> struct power<num, 0>{ enum { value = 0 }; }; それはどうかと思うぞ。
954 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:02:12 ] template<int num> struct power<num, 0>{ enum { value = 1 };};
955 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:13:50 ] <0,0>,<num,1>の特殊化は必要ないな
956 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:12:57 ] むしろこうしてコンパイル時エラーにしろよ。 template<> struct power<0, 0>{};
957 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:24:22 ] 0^0って数学的にはどうなるの?
958 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:22:38 ] >>956 n^0 = 1
959 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:23:20 ] スマン。レス番間違えた orz
960 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 22:28:09 ] >>957-958 一方で0 ^ n = 0となっているから問題になる。 ところで^と言えばXORの立場が。
961 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:22:20 ] VC6のtemplate関数ってバグある気がするんだけど... template<typename T> void test(); 引数無し呼んだときに解決できてないみたい... template<typename T> void test(const T&); みたいにすればオーバーロードで解決できるのか、大丈夫みたいなんだが...
962 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:36:11 ] いまどきそんな化石コンパイラに文句言われても…