- 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 あたりに。
- 39 名前:デフォルトの名無しさん mailto:sage [04/11/26 22:20:09]
- CとC++は分けたほうがいいと思うなぁ…
- 40 名前:デフォルトの名無しさん mailto:sage [04/11/26 22:27:48]
- 分けられるとlibpngをC++で使いたい時とか困るよなあ…
- 41 名前:デフォルトの名無しさん mailto:sage [04/11/26 22:56:58]
- 標準か非標準かよりも(比較的)汎用か非汎用かの方がスレを分ける際に重要だと思うけど。
MFCがC++スレに混ざってたら、大半の人にとっては無関係な話題が延々繰り返されるわけでうざくてしょうがないが、 boostもLokiもある程度の環境で使えるんだからみんな全く無関係ってほどでもないだろ?
- 42 名前:デフォルトの名無しさん mailto:sage [04/11/26 22:58:04]
- MFCは専用スレが既にあるから問題無いと思うが
- 43 名前:デフォルトの名無しさん mailto:sage [04/11/26 23:01:11]
- >>41
それってポータブルかどうかってことだと思うんだけど 訳は汎用でいいの
- 44 名前:デフォルトの名無しさん mailto:sage [04/11/26 23:03:32]
- >>43
気にするな。いい日本語が思いつかなかっただけだ。
- 45 名前:デフォルトの名無しさん mailto:sage [04/11/27 00:16:33]
- >>41
標準 / 非標準環境非依存 / 非標準環境依存 の3通りだな ...表記長いな
- 46 名前:デフォルトの名無しさん mailto:sage [04/11/27 17:22:23]
- ところで
boost/algorithm/string/replace.hppの //! Replace all algorithm ... \return A reference to the modified input */ って間違いだよね?replace_allは戻り値voidだし。
- 47 名前:デフォルトの名無しさん mailto:sage [04/11/27 21:39:17]
- コピペしたときに消し忘れたっぽいね。
- 48 名前:46 mailto:sage [04/11/28 00:02:14]
- むしろその方が使いやすいような気がするんだけどなぁ。俺が自分で
作って使っていたreplace_allは名前が同じで引数がまったく同じシグニチャで 戻り値だけが違って変更後の文字列への参照を返してた。
- 49 名前:デフォルトの名無しさん mailto:sage [04/11/28 00:08:42]
- In place modificationはvoidを返すんでいいよ。
プロトタイプ見ただけでin placeであることが分かる。
- 50 名前:デフォルトの名無しさん mailto:sage [04/11/28 00:14:09]
- あぁ、なるほど。そういう考え方の切り口があったのか。
アリガトン。
- 51 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:34:53]
- 以下のコードをビルドするとリンカで外部参照未解決というエラーがでます
template<class T> T Test(T t){ return t; } //template int Test<int>(int); //明示的に生成 int main(){ //Test<int>(0); //普通に使用 boost::bind(Test<int>, 1); return 0; } どちらかのコメントをとると上手くいきますが、こういう仕様でしょうか?
- 52 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:36:13]
- >>51 VC6か?
- 53 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:43:27]
- >>52
そうです
- 54 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:46:17]
- 捨てるしか
- 55 名前:デフォルトの名無しさん mailto:sage [04/12/02 11:08:46]
- >>54
そうですか。2005まで粘ろうかなぁ。なんて。あははhっは
- 56 名前:デフォルトの名無しさん mailto:sage [04/12/02 11:18:16]
- 2005 までは Toolkit とか 2005 Beta とか 2005 Express 使ってりゃいいじゃん
VC6 はさっさと捨てろ
- 57 名前:デフォルトの名無しさん mailto:sage [04/12/02 12:29:27]
- 貧乏人は死ね
- 58 名前:デフォルトの名無しさん mailto:sage [04/12/02 12:58:30]
- 優越感に浸りたいお年頃
- 59 名前:デフォルトの名無しさん mailto:sage [04/12/02 13:44:50]
- うちは金持ちだけど6.0
- 60 名前:デフォルトの名無しさん mailto:sage [04/12/02 13:52:18]
- ダメじゃん。
- 61 名前:デフォルトの名無しさん mailto:sage [04/12/03 03:22:13]
- >>59
金持ちだけど技術なし?
- 62 名前:デフォルトの名無しさん [04/12/09 01:13:37]
- 下がりすぎage
- 63 名前:デフォルトの名無しさん mailto:sage [04/12/09 01:36:48]
- template=天ぷらって?
- 64 名前:デフォルトの名無しさん mailto:sage [04/12/09 01:39:31]
- >>63
10点
- 65 名前:デフォルトの名無しさん mailto:sage [04/12/09 02:31:21]
- 10点ならいいじゃん。
オリンピックだって10点満点で評価してるしな。
- 66 名前:デフォルトの名無しさん mailto:sage [04/12/09 02:37:49]
- 違う。1000点満点中の10点だ。よく覚えとけ。
- 67 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:13:18]
- boostの質問はここでいいのでしょうか?
以下のようにboost::bindを二重に使うと上手くキャストできません。 二回目のBase&を渡すところで内部でコピーされてスライスされているのでしょうか。 ポインタで渡せば問題ないのですが、参照で保持してくれるようにはできませんか? struct Base { virtual ~Base() {} }; struct Hoge : public Base { }; void bar ( Base& b ){ if ( Hoge *p = dynamic_cast<Hoge*>(&b) ) std::cout << "bar ok" ; //ここへはこない } void foo ( Base& b ){ if ( Hoge *p = dynamic_cast<Hoge*>(&b) ) std::cout << "foo ok" ; boost::bind ( &bar, b )(); } int main(){ Hoge hoge; boost::bind ( &foo, hoge )(); return 0; }
- 68 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:19:54]
- boost::bind ( &foo, boost::ref( hoge ) )();
- 69 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:26:04]
- 間違えた
-boost::bind ( &bar, b )(); +boost::bind ( &bar, boost::ref ( b ) )(); -boost::bind ( &foo, hoge )(); +boost::bind ( &foo, boost::ref ( hoge ) )(); ね
- 70 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:28:55]
- bindが引数の型を推論するときにBase &のtop-level referenceを剥いじゃうんですよね・・・
- 71 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:30:22]
- >>69
67の例だとhogeをラップする必要はないですよ.
- 72 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:36:09]
- 即答ありがとうございます。上手くキャストされました
- 73 名前:デフォルトの名無しさん mailto:sage [04/12/12 14:38:59]
- listのメンバであるsort関数についてお尋ねしたいのですが、
これの引数であるCompare compというのはどういう物なのでしょうか。 関数オブジェクトやfunctionalの物かと思って色々試してみたのですが、どうにも上手くいきません。
- 74 名前:デフォルトの名無しさん mailto:sage [04/12/12 14:51:30]
- 普通に二項の関数オブジェクト
- 75 名前:73 mailto:sage [04/12/12 15:19:55]
- すいません、functionalでもgreaterだけは通りました。
lessやless_equal、greater_equalでは駄目みたいです。 >>74 レスありがとうございます。では私の何かやり方がまずいっぽいです。 どうか添削して頂けないでしょうか。 #include <iostream> #include <list> using namespace std; struct func_object{ bool operator()( const int& lhs, const int& rhs ){ return lhs < rhs; } }; int main(){ list<int> list_hage; list_hage.push_back( 5 ); list_hage.push_back( 1 ); list_hage.push_back( 3 ); list_hage.sort( func_object() ); //error: struct func_objectから、struct std::greater<int>に変換できません(VC6) //確認用 for( list<int>::iterator it = list_hage.begin(); it != list_hage.end(); ++it ){ cout << (*it) << endl; } return 0; }
- 76 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:41:31]
- >>75
コンパイラがまずいんじゃないの?gcc3.4.2では普通に通るぞ。 #include <iostream> #include <list> struct func_object { bool operator()(const int& lhs, const int& rhs) const { return lhs < rhs; } }; int main() { std::list<int> list_hage; list_hage.push_back(5); list_hage.push_back(1); list_hage.push_back(3); list_hage.sort(func_object()); //確認用 for (std::list<int>::const_iterator it = list_hage.begin(); it != list_hage.end(); ++it) std::cout << *it << std::endl; }
- 77 名前:うすげ mailto:sage [04/12/12 15:43:16]
- hogeの代わりにhageを使うヤツは嫌い。
- 78 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:54:32]
- だからVC6じゃC++は使えないんだって何度言えば
- 79 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:56:45]
- >>76
確認ありがとうございます。おかげですっきりしました。 勉強中の身ですし、頭からコンパイラのせいだ!とは言いづらく…。 >>77 私も眉毛と生え際の間がフォーフィンガーでして、自嘲の意味で良く使うのですが、配慮が足りずすいません。
- 80 名前:つる mailto:sage [04/12/12 16:03:40]
- >>うすげ
気にするな 個性だ
- 81 名前:デフォルトの名無しさん mailto:sage [04/12/12 21:56:38]
- こんどからusageの替わりにusugeを使おう。
- 82 名前:デフォルトの名無しさん mailto:sage [04/12/14 23:42:13]
- 偉大なるstroustrupに敬意を示すため
我々C++プログラマは、むしろ積極的にhageを使っていくべきじゃなかろうか
- 83 名前:Addicted to C++ ◆nrBjarne.g mailto:sage [04/12/14 23:44:30]
- むしろ積極的にトリップにBjarneを入れていくべきではないだろうか。
- 84 名前:デフォルトの名無しさん mailto:sage [04/12/16 16:49:49]
- >>78
意味不明。
- 85 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:28:50]
- つまり
VC++6使ってる奴は貧乏人 っていうことですよ
- 86 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:38:24]
- 決して割れに手を出さない分、高貴とも言える
- 87 名前:デフォルトの名無しさん mailto:sage [04/12/16 18:12:58]
- 金が無いならvc2005 betaでも使えば良いだろ。
- 88 名前:デフォルトの名無しさん mailto:sage [04/12/16 19:35:46]
- 金が無いならVCTKでも使えば良いだろ。
- 89 名前:デフォルトの名無しさん mailto:sage [04/12/16 21:13:44]
- 金がないならハンドコンパイルすればよいだろ。
- 90 名前:デフォルトの名無しさん [04/12/17 11:45:57]
- Boost.Spirit見てて思ったんだが、
同じようにSQLクエリをC++で記述できないもんかな。 sql.select( Person.name, Person.sex ).from( Person ).where( Person.age>=20 ); ってな感じで。
- 91 名前:デフォルトの名無しさん mailto:sage [04/12/17 12:40:12]
- >>90
わらった。変態すぎ。
- 92 名前:デフォルトの名無しさん mailto:sage [04/12/17 13:36:33]
- >>90
ちょっと面白そう
- 93 名前:デフォルトの名無しさん mailto:sage [04/12/17 23:54:26]
- >>90
今作ってるオリジナル言語のコンパイラが完成したら 開発に着手する気でいたw
- 94 名前:デフォルトの名無しさん mailto:sage [04/12/18 13:24:58]
- >>90
ttp://www.tietew.jp/cppll/archive/330
- 95 名前:デフォルトの名無しさん [04/12/25 14:39:04]
- T1 と T2 が整数型という前提で sizeof(T1) > sizeof(T2) の時に
T2型の整数をゼロ拡張してT1型の整数に変換するテンプレート関数 はどのように書けばよいでしょうか? template<class T1, class T2> T1 zero_ext( const T2& x );
- 96 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:01]
- ゼロ拡張?
意味不明。 俺用語を使うな。
- 97 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:07]
- >>95
template<class T1, class T2> T1 zero_ext(const T2& x) { return static_cast<unsigned T1>(x); }
- 98 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:05:50]
- >>96 (´゚c_,゚` ) プッ
www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-32,GGLD:ja&q=%E3%82%BC%E3%83%AD%E6%8B%A1%E5%BC%B5
- 99 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:47:33]
- ISO C++の4.7.2にあるunsignedのintegral conversionの事でしょうね。
zero expansionってのはアセンブラの世界では良く使うね。
- 100 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:51:47]
- >>97
それだと、T2が符号付きのときに符号拡張されちゃうんじゃないか?
- 101 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:05:04]
- じゃあこうか?
template<class T1, class T2> T1 zero_ext(const T2& x) { return static_cast<unsigned T1>(static_cast<unsigned T2>(x)); }
- 102 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:06:37]
- そもそもunsigned T1とかできるのかな?
- 103 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:15:08]
- よく知らんが、boost::numeric_convertionってそういう目的のライブラリじゃないのかな?
- 104 名前:デフォルトの名無しさん [04/12/25 19:10:36]
- template<typename T, typename Container = std::map<Key, T>, typename Key = std::size_t> class Tree { };
こういう順番にテンプレート引数を取りたいのですが、どうしたらいいでしょうか? Tree<int, std::vector<T> >としたときKeyは当然不要なので省略できるようにしたいのです。
- 105 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:13:29]
- テンプレートのデフォルト引数は一つまでだYO
- 106 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:15:55]
- 無理じゃね?
- 107 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:21:17]
- Tree<std::vector<int> > としたときTは当然不要なので
- 108 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:47:26]
- struct use_default{};
template <typename T, typename Container = use_default, typename Key = use_default> class Tree{/* がんばって情報を取り出す */}; boost::iterator_adapterの実装が参考になるかも試練。
- 109 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:57:26]
- おまえらぶーすとに踊らされすぎだぶー
- 110 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:02:46]
- boostは一緒に踊ってくれる数少ない仲間なんだよ。
- 111 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:04:43]
- 踊る阿呆に見る阿呆、同じ阿呆なら踊らにゃソンソン
- 112 名前:デフォルトの名無しさん mailto:sage [04/12/25 21:42:20]
- 踊らにゃシャンソン
- 113 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:01:15]
- >>111
必ずどちらかの阿呆であるという無理な前提で人を煽るその言葉は大嫌いだ。
- 114 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:24:27]
- 2択でもなく決め付けだしな
詭弁だ
- 115 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:27:59]
- なんで踊るよりも見る方が損なのかがわからん。
踊ったら疲れるだけなのに。
- 116 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:47:49]
- 理論(見る)より実践(踊れ)てこと
- 117 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:51:29]
- >>115
踊ることが楽しいと言いたいのだろう。
- 118 名前:デフォルトの名無しさん [04/12/25 23:20:36]
- >>101
VC++ 7.1 だと unsigned T1 のような書き方は構文エラーになりました。
- 119 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:16:22]
- C++Templateの便利な機能のうち
Javaでは実現できないことってなんなのかを 教えてください。
- 120 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:17:25]
- 特殊化
- 121 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:18:39]
- ていうかほぼ全部?
- 122 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:13:48]
- >>119
使ってすぐ分かるのは、コンテナから取り出すときにナローイング変換しなくていいこと。
- 123 名前:120 mailto:sage [04/12/26 01:16:18]
- あれ?
Java Genericsかと思ったけど、Javaか…
- 124 名前:デフォルトの名無しさん mailto:sage [04/12/26 04:53:50]
- JavaのGenericsってただの自動キャストでそ?
C++のtemplateとは比較にならないのでは・・・
- 125 名前:デフォルトの名無しさん mailto:sage [04/12/26 08:56:50]
- .NETのgenerics、試みは面白い。
- 126 名前:デフォルトの名無しさん [04/12/26 13:31:14]
- で、結局具体的にどんなことがJavaにできなくて
C++で出切るんですか? C++ではこんなに簡単に書けるのに Javaで書くとこんな風になっちゃうって例を 出していただけると助かります。 いろいろ考えたんですが、特別優れた使い方ってのが 思いつかなかったので。 もしかして、ないのかな・・・
- 127 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:01:11]
- クマー
- 128 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:13:40]
- .| | | | | | | |
.| | | レ | | | | ∩___∩ | | | J | | | | ノ\ ,_ ヽ .| レ | | レ| / ●゛ ● | .J し | | | ∪ ( _●_) ミ .| し 彡、 |∪| | .J / ∩ノ ⊃ ヽ ( \ / _ノ | | \ " / | | Javaしらね。覚える気もねえし \ / ̄ ̄ ̄ /
- 129 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:56:55]
- >>126
Java Genericsは分かるの?
- 130 名前:デフォルトの名無しさん mailto:sage [04/12/28 00:49:18]
- >>126
「オブジェクト指向をベース」にプログラムを書いた場合 JavaのGenericsで全てが事足りる。
- 131 名前:デフォルトの名無しさん mailto:sage [04/12/28 01:22:25]
- 速度以外はな。
- 132 名前:デフォルトの名無しさん mailto:sage [04/12/28 05:44:30]
- 素人が首突っ込んで申し訳ないが
Javaには専用プラットフォーム必須なんだよね? 要はエミュレータ?
- 133 名前:デフォルトの名無しさん mailto:sage [04/12/28 08:33:23]
- >>132
プラットフォームの意味わかってんのか?
- 134 名前:デフォルトの名無しさん mailto:sage [04/12/28 12:28:32]
- >>126
Lokiのような変態的なライブラリは無理じゃないの?Generics知らんけど。
- 135 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:19:32]
- その変態なLokiなんですけど、TYPELISTって動作遅くしないですか?
継承によって、多義性をサポートさせるのはよい。 コンパイル時にその多義性を作り出すのも良い。 けど、継承って、実行速度おそくなりませんか?
- 136 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:24:09]
- >>134
あれはオブジェクト指向を捨ててるからな。 オブジェクト指向で書き直せばもっときれいなのが作れるよ。
- 137 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:38:33]
- >>135
Modern C++ Designを読めば分かるけど、 LokiのPolicyは仮想関数を使ってないから…
- 138 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:22]
- >>135
TYPELISTはコンパイル時のみ。 継承なしで巨大ライブラリを作れる人、使える人はそうしたら良かろう。 Cで書いてあるgtk+みたいなのでも継承しているけどね。
- 139 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:58]
- 大抵は問題にならん
|

|