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 あたりに。
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 ] いまどきそんな化石コンパイラに文句言われても…
963 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 13:39:14 ] 化石以前にtemplateに関しては欠陥コンパイラですから・・・
964 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 17:42:46 ] そもそもC++コンパイラじゃないですから
965 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 22:25:31 ] 少なくともANSI/ISO C++準拠とは言えないな。
966 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 04:44:36 ] じゃーVC7はどうですか?
967 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 05:23:27 ] 7.1はかなりまとも。
968 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 12:23:52 ] 7と7.1は全然違うぞ 7はかなり微妙
969 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 13:11:10 ] 7はCStringにバグがあったね。STL周りもちょっと不安定なところがあった気もする。
970 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 14:50:27 ] 7.1って具体的にclのどのバージョン? 今 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86 っての使ってるけど
971 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 15:06:35 ] VS.net(VC.net)2003か、VCTK2003のやつが7.1 13.10.3077なら7.1だな。VS.net2003の方のやつだろ。
972 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:36:27 ] codeguruに記事の投稿してみたがレビュー通んないとだめなんだね
973 名前:デフォルトの名無しさん [2005/10/18(火) 15:57:25 ] age
974 名前:デフォルトの名無しさん mailto:sage [2005/10/26(水) 22:29:10 ] 人稲杉なので、バカネタを投下。 www.hakusi.com/up/src/up5538.zip.html Boost.Lambda みたいに Expression Template を使った、引数に対して安全なフォーマットライブラリ。 Boost.Function や、Boost.Bind と組み合わせることが可能。 以前作成したものと違い、オマケ機能だが入力も可能で、ワイド文字にも対応。 ただ、 _ と % だらけで見た目がキモイ上に、実用性がイマイチ謎。 Expression Template の資料として。 // 出力 string strA, strB; sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" ); // sprintf( str, "%#6x/%s", 10, "aaaa" ); みたいな。 sprint( strB, "2 " % (!_x[6]*='0') % "/" %_s, 10, "aaaa" ); // sprintf( str, "%#06x", 10, "aaaa" ); みたいな。 cout << strA << endl; // 1 0xa/aaaa と出力 cout << strB << endl; // 2 0x000a/aaaa と出力 // 入力 int xA, xB; string yA, yB; sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA ); // 空白部分はスキップさせる sscan( strB, "2 " % _x % "/" % _s[3], xB, yB ); // 文字列部分は3文字のみ取得 // 出力 print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA ); print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB ); // xA = 10 // yA = aaaa // xB = 10 // yB = aaa と出力
975 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 00:15:14 ] >>974 せっかくなので便乗しておきますね.将来の話なのでアレですけれど. www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1603.pdf
976 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 10:05:49 ] 難読コンテスト会場はここですか?
977 名前:デフォルトの名無しさん [2005/10/31(月) 13:08:43 ] >>974 すげー--w 確かに scanf っぽいこと出来るし。 でも、Perl みたいで汚いな。使おうとは思わんけど。
978 名前:デフォルトの名無しさん mailto:sage [2005/10/31(月) 13:59:50 ] >>974 マジキモス
979 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:02:41 ] >>974 良くこんなん書く気になるなあ。
980 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:40:35 ] >>975 boostな人達はあれば便利だけど、一般人的にはどうなのかなあ?
981 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 16:19:39 ] >>980 どの辺が便利なのか理解に苦しむ。
982 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:49:05 ] >>980 型安全な printf, scanf というのが一番インパクトが大きいと思います. 後,lambda のような(擬似的な)可変長テンプレート引数を使ったライブラリの コンパイル時メッセージが見やすくなるというのもあるかと. >>981 Boost な人にとっては,これまでプリプロセッサなどで力技で実装していた Function, Tuple, MPL, Lambda など多くのライブラリの実装が 非常に楽に見通しよく実装できるようになり,便利になると思います.
983 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:15:01 ] >>982 コンパイルエラーなどたいして問題じゃないけどね。 それよりもデバッグの方が大変。
984 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:19:33 ] 変な拡張するより単にプリプロセッサを名前空間対応にすればいいだけちがうの?
985 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:30:42 ] >>984 それじゃプリプロセッサにならないでしょ。
986 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:19:51 ] え、C/C++のプリプロセッサってトークン理解してるはずなんだけどなあ。 商用じゃプリプロセスと同時に解析するのが主流だし。 テンプレート引数程度の局所的変更じゃ根本的解決にならないでしょ。
987 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:26:54 ] 名前空間を通常のものとプリプロセッサで共有しようとすると 泥沼になる気がする。(例えば # define STD_BEGIN namespace std{ とか) pp専用の名前空間ならwaveが実験的に対応している。
988 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 22:37:23 ] プリプロセッサと言えば、C++/CLIでとんちきな拡張してるよ。 スペース区切りキーワードってやつ。 www.microsoft.com/japan/msdn/vs05/visualc/TransGuide.asp
989 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 00:29:44 ] プリプロセッサと本体の間のフォーマットってANSIか何かで標準規格ある? #132 "hogehote.h" たいていはこんなの出るんだよね?
990 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:08:57 ] 次スレ立てて良いですか?
991 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:21:16 ] C++相談室で十分だと思うんだ。
992 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:32:58 ] ハゲドー 一年もかかってやっと1スレなペースだし
993 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:40:20 ] >>983 > コンパイルエラーなどたいして問題じゃないけどね。 断言君さようなら
994 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 11:26:29 ] 断言君だって。なにその俺様用語w オナニーマクロだらけの糞コード書いてる奴は 日本語にもそれが出るね。
995 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:12:24 ] 断言君 の検索結果 約 926,000 件中 1 - 10 件目 (0.27 秒)
996 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:25:58 ] 俺も>>983 を支持する。 ランタイムエラーが恐ろしいのであって、 コンパイルエラーなどコンパイラとの対話交渉に過ぎない。
997 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:14:27 ] てかさ、コンパイルエラーが出てたら、 そもそも実行ファイルはビルドされて無いんじゃないか? ワーニングなら分かるけど。
998 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:49:38 ] つぎスレ立てるかどうか迷っているんだが このスレのタイトルをよく吟味したら 「統合」:いくつかの物を一つにまとめあわせること このように辞書では出ている。 つーことは「STL相談室」も「BOOSTを語れ」も入らないよーな気がした。 それとも、ここのつぎスレが要らないのか? そんな疑問を抱いてしまって、俺には次スレを立てる勇気がない。 さあ。次をたてる勇者はだれか。
999 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:53:56 ] boostは微妙だがSTLスレもこのスレも必要なし あっても混乱するだけ
1000 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 14:02:28 ] STLを使うと実行ファイルのサイズが10倍になるから スレは統合すべきだと思います。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。