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 あたりに。
304 名前:デフォルトの名無しさん mailto:sage [05/02/07 17:41:03 ] あったけど、ここに統合。
305 名前:デフォルトの名無しさん [05/02/11 13:36:27 ] テンプレートを使ったクラスでundefined referenceがでます。 ソースは次のようなものです。プリプロセッサは省略してあります。 //temptest.h template<class T> class temptest{ public: temptest(); }; //temptest.cpp template<class T> temptest<T>::temptest(){} //main.cpp int main(){ temptest<int> t; return 0; } gccでは "undefined reference to `temptest<int>::temptest(void)" VisualC++6では "public: __thiscall temptest<int>::temptest<int>(void)は未解決です" というエラーです。 ちなみに定義をインラインにしたらうまくできました。 どなたか解決方法を教えてください。
306 名前:デフォルトの名無しさん mailto:sage [05/02/11 13:40:12 ] >>305 templateの定義はヘッダに書かないとダメ、ということになってます。
307 名前:304 mailto:sage [05/02/11 13:50:47 ] そんな決まりがあったんですか。 でもSTLのインクルードファイルを見たところ宣言だけのようですが、 STLは特別なんでしょうか。
308 名前:デフォルトの名無しさん mailto:sage [05/02/11 13:52:15 ] STLもヘッダの下のほうに書いてあるんじゃねーの
309 名前:デフォルトの名無しさん mailto:sage [05/02/11 13:52:42 ] STLも例外ではないよ クラステンプレートに実体がなくてもその後ろにクラスメンバのテンプレートの実体が定義されてるはず
310 名前:デフォルトの名無しさん mailto:sage [05/02/11 14:13:29 ] stlportだとcppをヘッダからincludeしてたとおもう
311 名前:デフォルトの名無しさん mailto:sage [05/02/11 14:44:21 ] ヘッダからcppをインクルード・・・萌えるな。
312 名前:デフォルトの名無しさん mailto:sage [05/02/11 15:04:53 ] >>307 temptest.cpp コンパイル時には class T が何だか解らないので コンストラクタは生成されない ↓ main.cpp コンパイル時には temptest<int> のコンストラクタが どこかにあるものとしてコンパイル ↓ リンクしてみたら、どこにもいない 明示的にインスタンス化するよろし。 //temptest.cpp template class temptest<int>;
313 名前:デフォルトの名無しさん mailto:sage [05/02/11 16:01:01 ] exportキーワードをまともに実装した処理系はComeau C++だけでしょ。
314 名前:デフォルトの名無しさん mailto:sage [05/02/11 19:41:42 ] もう諦めてexportを標準から外した方が良いんじゃないかとさえ思ったり. 現状,exportによる利得というのがほとんど無いみたいですし.
315 名前:デフォルトの名無しさん mailto:sage [05/02/11 21:11:04 ] つーか既に実装しなくていいよもう、ってことになったんじゃなかったか?
316 名前:デフォルトの名無しさん mailto:sage [05/02/11 21:50:10 ] >315 ソースきぼんぬ. export周りは泣きそうなほどグダグダみたいですし,さもありなんですけど.
317 名前:デフォルトの名無しさん mailto:sage [05/02/11 22:10:19 ] それがC++クオリティ
318 名前:デフォルトの名無しさん mailto:sage [05/02/12 06:49:19 ] >>316 D&E日本語版読んでみ。 exportは未だに実装してないといけない規格になっている。
319 名前:デフォルトの名無しさん mailto:sage [05/02/12 19:42:14 ] exportって何?
320 名前:デフォルトの名無しさん mailto:sage [05/02/12 19:42:57 ] るby
321 名前:デフォルトの名無しさん mailto:sage [05/02/16 10:47:32 ] shared_ptrとかintrusive_ptrのリファレンスカウント操作って 引数で値渡しすると呼び出しのたびに操作しますよね。 最適化によるコード削減を阻害しないでしょうか? 特にテンプレートを展開したもののコードがどうなるかが気になります。
322 名前:デフォルトの名無しさん mailto:sage [05/02/16 11:26:01 ] >>321 適材適所で。 それからテンプレートの勉強もね。
323 名前:デフォルトの名無しさん mailto:sage [05/02/16 11:38:00 ] >>322 要するにオーバーヘッドはかかるというお答えという理解でよろしい? intrusive_ptrの参照を渡せばいいんですけど、ポインタの置き換えに使うつもり でいるといまひとつ面倒というか泥くさいというか。 あと、これらのコンテナをfor_eachなどで処理するときのbind(+lambda)で、 _1 と書くだけじゃdeductionしてくれず、bind(&HogePtr::get, _1) のようにしないといけないのが面倒で、 これを何とか自動でやってくれるようにする方法はありませんか。 HogePtrという派生クラスを作ってポインタから暗黙的にキャストさせると 一番簡単にコンパイラを黙らせられるんですが、今度はコンテナを処理するときに 毎回HogePtrを作って比較するというコードを出してくるようになるので、 なるべく派生はさせずに済ませたい。
324 名前:デフォルトの名無しさん mailto:sage [05/02/16 20:11:57 ] 参照カウンタによるオーバーヘッドが許せないのなら、 shared_ptr系は精神衛生上使わないほうがいいと思う。
325 名前:デフォルトの名無しさん mailto:sage [05/02/17 00:41:46 ] >>323 bind の件は既に修正済みのはず。
326 名前:デフォルトの名無しさん mailto:sage [05/02/17 14:17:53 ] >>323 恐ろしいことだが君のようなハッカーには それらはもうレガシーだ。boostなのにね。 sandboxにModern C++ Designのを移植した policy_ptrというのがあるので見るべき これはなかなか強烈だよ
327 名前:デフォルトの名無しさん mailto:sage [05/02/18 02:14:48 ] >>326 お前は独逸の詩人かよ!?
328 名前:デフォルトの名無しさん [05/02/18 12:12:10 ] >>326 ポリシーベースの派、前に検討して却下してshared_ptr達が採用されたのに なんで今更?
329 名前:デフォルトの名無しさん mailto:sage [05/02/18 20:40:47 ] >328 その議論読んでみたいんですがどこにありますか? policy_ptrは「shared_ptrは重い」といった主張を持つユーザに対する 選択肢の一つとして提供されるのだと思いますよ. そもそもpolicy_ptrはshared_ptrなどの既存のスマートポインタに取って代わるものではなく, むしろそれらと相補関係にあって共存するべきものですし. なのでshared_ptrを"legacy"と表現するのは恐らく適切ではないです. ここら辺のもう少し詳しい議論は以下のスレッドや policy_ptrのドキュメントのFAQあたりが参考になると思います. thread.gmane.org/gmane.comp.lib.boost.devel/116983
330 名前:デフォルトの名無しさん mailto:sage [05/02/18 21:19:44 ] 似たような*_ptrばっか増やして、 馬鹿じゃないの? ふざけてるの?
331 名前:328 mailto:sage [05/02/18 21:23:27 ] >>329 boost.cppll.jp/HEAD/libs/smart_ptr/shared_ptr.htm#FAQ の2番目を。
332 名前:デフォルトの名無しさん mailto:sage [05/02/18 23:38:55 ] >>330 C++ ってそういうもんだよ。人によって用途も違えば、実行環境のリッチさも 天と地ほど違うので。
333 名前:デフォルトの名無しさん mailto:sage [05/02/22 15:00:52 ] 新規にクラスを作るならば、COM のように侵入型の参照ポインタにして、 intrusive_ptr で管理するとか
334 名前:デフォルトの名無しさん mailto:sage [05/02/22 17:27:12 ] STLかboostあたりに、ある条件を満たすものをoutput_iteratorにコピー するような関数はないでしょうか? boost::mplにcopy_ifというそれらしい名前のがあるんですが、 使い方がさっぱりわからない……
335 名前:デフォルトの名無しさん mailto:sage [05/02/22 17:40:29 ] なぜか std に copy_if ないんだよね・・・ boost::filter_iterator と std::copy でなんとか汁
336 名前:デフォルトの名無しさん mailto:sage [05/02/22 17:43:19 ] std::remove_copy_if(first, last, std::not1(pred));
337 名前:336 mailto:sage [05/02/22 17:43:58 ] ごめん。 std::remove_copy_if(first, last, out, std::not1(pred); だ。
338 名前:デフォルトの名無しさん mailto:sage [05/02/22 18:06:02 ] 今回は元のコンテナを変更したくないのでremove_copy_ifは使えなさそうです。 結局自分で書きました。 自分でforループを書くと頭悪くなったように感じるので、 これくらいstdに入れておいてほしいものです……。 template <class InputIterator, class UnaryFunction, class OutputIterator> void copy_if(InputIterator begin, InputIterator end, OutputIterator result, UnaryFunction pred) { for ( ; begin != end; ++begin) if (pred(*begin)) { *result = *begin; ++result; } } g++のヘッダを見るとconcept checkとやらを入れたほうがいいらしいのですが、 何を使えばいいのかよくわからんです。boostに道具があるんでしょうか。 remove_copy_ifも説明がよくわからんのですよね。 削除するのに大きさが変わらないってどういうこと?
339 名前:デフォルトの名無しさん mailto:sage [05/02/22 18:06:58 ] >>338 remove_copy_ifは入力シーケンスを変更しないよ。
340 名前:デフォルトの名無しさん mailto:sage [05/02/22 18:17:58 ] >>338 return result;
341 名前:一つ賢くなった! mailto:sage [05/02/22 18:32:43 ] >>339 おお、本当だ。コードを見るとほぼそっくりではないですか。 今までremove_copy_ifは元のを破壊的に変更しつつ、削除したものを コピーするのだと思っておりました。 名前がミスリーディングだと思うのです……。 >>340 忘れてました。というか気にしてなかったのですが、返すべきですね。
342 名前:デフォルトの名無しさん mailto:sage [05/02/22 19:24:56 ] struct NURUPO { template<typename T> operator T*() { return 0; } }; int ILoveNurupo() { NURUPO mynurupo; return (int)mynurupo[0]; } vc7.1とgcc3.3にガッ
343 名前:デフォルトの名無しさん mailto:sage [05/02/22 21:10:19 ] なんか違わないか?
344 名前:デフォルトの名無しさん mailto:sage [05/02/23 01:38:28 ] >>338 STLPortには入ってるよ。
345 名前:デフォルトの名無しさん mailto:sage [05/02/24 14:00:35 ] テンプレートの特殊化ってどこに書きますか? 以下のように特殊化する型の定義と一緒に書くと、 * primary.h #include <iostream> template <class T> inline void foo(const T&) { std::cout << "primary\n"; } --- * specialized.h #include "primary.h" struct bar {}; template <> inline void foo(const bar&) { std::cout << "specialized\n"; } --- * troublesome.h struct bar; bar& get_bar();
346 名前:345 mailto:sage [05/02/24 14:01:58 ] * troublesome.cpp #include "specialized.h" bar& get_bar() { static bar b; return b; } void trouble1() { foo(get_bar()); // #1 } --- * main.cpp #include "primary.h" #include "specialized.h" // #2 #include "troublesome.h" int main() { foo(get_bar()); return 0; } --- #1 と #2 をコメントアウトしたりしなかったりで実行結果が変化します。 具体的には #1 と #2 の両方をコメントアウトした場合 primary が出力されます。 かといって、極端な話 STL のヘッダファイルに書き足すわけにもいけませんし・・・。
347 名前:デフォルトの名無しさん mailto:sage [05/02/25 00:39:40 ] >>345 ttp://www.kuzbass.ru/docs/isocpp/template.html#temp.expl.spec 14.7.3 -6- および -7- で、 使う場所より前に特殊化は宣言されていないといけない、 というルールは書いてあるが、コンパイラによるチェックは不要ということになっている。 あげくに規格中に「宣言の位置には気をつけろ」と書かれている。 primary.h の foo<T> の中でダミーでいいから sizoef(T) を使って、 不完全型ではインスタンス化できないようにしておけば、 いちおうエラーにすることができると思う。
348 名前:デフォルトの名無しさん mailto:sage [05/02/28 11:44:49 ] template<class T> class A { public: void hoge() { } void foo() { } // 他にいろいろなメンバがある }; というクラステンプレートがあって、プログラム中でA<T>::hogeだけどこからも使われなかったとき A<T>::hogeのコードは生成されるのでしょうか?
349 名前:デフォルトの名無しさん mailto:sage [05/02/28 12:01:34 ] >>348 されない。だから定義しなくても大丈夫。
350 名前:デフォルトの名無しさん mailto:sage [05/02/28 19:22:11 ] >>348 処理系依存
351 名前:デフォルトの名無しさん mailto:sage [05/02/28 21:47:50 ] >>350 ほんと?
352 名前:デフォルトの名無しさん mailto:sage [05/02/28 22:10:33 ] 一応標準としてはAの暗黙のインスタンス化ではhogeはインスタンス化されません.(14.7.1/1) ちなみにAの明示的インスタンス化の際にはhogeのインスタンス化が伴います.(14.7.2/7)
353 名前:デフォルトの名無しさん mailto:sage [05/02/28 22:10:41 ] >350は狼少年
354 名前:デフォルトの名無しさん mailto:sage [05/03/01 22:32:51 ] >>348 Modarn C++ Designの1.8に、生成されないことを前提にした技法があったな確か。 シンタックス・チェックだけは、実装によっては行われるんだったっけか。
355 名前:デフォルトの名無しさん mailto:sage [05/03/02 01:29:19 ] Modern ね
356 名前:デフォルトの名無しさん mailto:sage [05/03/02 12:31:04 ] スマソ
357 名前:デフォルトの名無しさん mailto:sage [05/03/08 02:55:11 ] AdobeのASLもここでいいんかな?
358 名前:デフォルトの名無しさん mailto:sage [05/03/08 10:23:35 ] 使われているプログラミング技法を語るならここかな あるいはBoostスレか
359 名前:デフォルトの名無しさん mailto:age [05/03/09 18:17:53 ] 以下のコードで complex を set に入れようとしたところ、 「stl_function.h:197: error: no match for 'operator<' in '__x < __y'」 とか言われてしまうのですが (g++ 3.3.3)、原因が分かりません。 何がおかしいのでしょうか。 #include <complex> #include <set> using namespace std; bool operator<(const complex<int> &a, const complex<int> &b) { return real(a) < real(b) || (real(a) == real(b) && imag(a) < imag(b)); } int main() { set<complex<int> > s; s.insert(complex<int>(1, 2)); return 0; }
360 名前:デフォルトの名無しさん mailto:sage [05/03/09 18:39:00 ] >>359 <set>の中からそのoperator<()が見えていない。しかしoperator<()を #includeよりも前に持ってくると今度はcomplexが定義されていない。 しかしstd名前空間内部のものを先行宣言することは許されていない。 自分で関数オブジェクトを定義するしかない。
361 名前:デフォルトの名無しさん mailto:sage [05/03/09 18:40:16 ] namespace std { bool operator<(const complex<int> &a, const complex<int> &b) { return real(a) < real(b) || (real(a) == real(b) && imag(a) < imag(b)); } } で通ったけど、これってやっていいことだっけ……?
362 名前:デフォルトの名無しさん mailto:sage [05/03/09 18:56:02 ] >>360 > <set>の中からそのoperator<()が見えていない。 これは関係ない。どうせグローバルのoperator<は使われない。
363 名前:デフォルトの名無しさん mailto:sage [05/03/09 19:00:21 ] >>361 結論:ダメ 宣言や定義をstd名前空間に加えてはならない。今回の場合、struct std::less<>の特殊化も考えられるが、後述の規定によりuser-definedな名前で 特殊化しない限りundefined behaviorとなる。 17.4.3.1 Reserved names -1 It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces within namespace std unless otherwise specified. A program may add template specializations for any standard library template to namespace std. Such a specialization (complete or partial) of a standard library template results in undefined behavior unless the declaration depends on a user-defined name of external linkage and unless unless the specialization meets the standard library requirements for the original template.
364 名前:デフォルトの名無しさん mailto:sage [05/03/09 19:17:37 ] >>362 #include <set> using namespace std; struct hoge{int x;}; bool operator<(const hoge& a, const hoge& b){return a.x < b.x;} int main(){ set<hoge> s; s.insert(hoge()); return 0; } これ通らない?
365 名前:デフォルトの名無しさん mailto:sage [05/03/09 21:08:49 ] >364 それはhogeとoperator<が同じ名前空間(グローバル)で定義されているので通りますよ. std::complexを引数とする呼び出しからoperator<が見えるためには operator<がstd名前空間で定義されていないといけないです. でもそのような定義をstd名前空間に追加することは許されないので(>363), 自分で関数オブジェクトを書いて(>360)それをsetのテンプレート引数に与えるしかないです.
366 名前:デフォルトの名無しさん mailto:sage [05/03/09 21:12:46 ] で、結局こう、と。 #include <complex> #include <set> using namespace std; template <typename T> struct complex_less: binary_function<complex<T>, complex<T>, bool> { bool operator() (const complex<T>& a, const complex<T>& b) { return real(a) < real(b) || (real(a) == real(b) && imag(a) < imag(b)); } }; int main () { set< complex<int>, complex_less<int> > s; s.insert(complex<int>(1, 2)); return 0; }
367 名前:359 mailto:sage [05/03/09 21:25:39 ] >>360-366 皆さんありがとうございます。よく分かりました。 ちゃんと勉強しないとダメだなぁ〜 orz
368 名前:デフォルトの名無しさん mailto:sage [05/03/09 21:55:23 ] string とか pair が std 名前空間に operator < を定義しているから ADL のせいで operator < を std 名前空間の外に探しに行かないという認識であってますか?
369 名前:デフォルトの名無しさん mailto:sage [05/03/09 22:09:23 ] ↑俺には断言できん ↓あってるのか?
370 名前:デフォルトの名無しさん mailto:sage [05/03/09 22:11:50 ] あってる。
371 名前:369 mailto:sage [05/03/09 23:24:46 ] >>368 あってるぞ。 よし、俺ツーポイントゲット。
372 名前:デフォルトの名無しさん mailto:sage [05/03/10 04:08:30 ] その為に less がテンプレート引数になってるんではないのか。 …と、こないだ初めて map で less を使った俺が言いました。
373 名前:デフォルトの名無しさん mailto:sage [05/03/11 02:09:30 ] 練習で push_back_if なるものを書いてみたのですが 駄目だしお願いします。 template <typename IIte, typename Container, typename Pred> void push_back_if(IIte b, IIte e, Container &c, const Pred p) { for(;b!=e;b++) { if(p(*b)) c.push_back(*b); } } insert_if とか copy_if ってないんですか? あったら便利だと思うのですが・・・。
374 名前:デフォルトの名無しさん mailto:sage [05/03/11 02:24:34 ] copy_ifはある。あとはback_inserterを組み合わせて使えばよし。
375 名前:デフォルトの名無しさん mailto:sage [05/03/11 02:27:17 ] > copy_ifはある。 ウソだった。標準ではない。すまん。
376 名前:デフォルトの名無しさん mailto:sage [05/03/11 02:36:13 ] >>373 残念ながらcopy_ifは標準にはない。どっかに作っておいたら? //copy_if template <typename InputIterator, typename OutputIterator, typename Predicate> inline OutputIterator copy_if(InputIterator begin, InputIterator end, OutputIterator destBegin, Predicate p) { while (begin != end) { if (p(*begin)) *destBegin = *begin; ++destBegin; ++begin; } return destBegin; }
377 名前:デフォルトの名無しさん mailto:sage [05/03/11 16:52:41 ] >>373 > for(;b!=e;b++) ++bにしたほうがいい。
378 名前:デフォルトの名無しさん mailto:sage [05/03/11 19:43:05 ] >377 また荒れるようなことを
379 名前:デフォルトの名無しさん mailto:sage [05/03/11 20:28:43 ] いやいや荒れるまでもなく当たり前の事ですよ
380 名前:373 mailto:sage [05/03/11 21:26:10 ] >>374-379 レスが遅くなってすいません。参考にします。
381 名前:デフォルトの名無しさん mailto:sage [05/03/13 00:46:27 ] 荒れてもいいから理由を教えろ
382 名前:デフォルトの名無しさん mailto:sage [05/03/13 01:27:48 ] >>381 後置インクリメントだと、一時オブジェクトが必要になるから。 POD型の場合でもレジスタを余計に必要としたりね。 #それが理由で後置インクリメントを持たないクラスも作ることも多いし。
383 名前:デフォルトの名無しさん mailto:sage [05/03/13 01:32:28 ] C++より++C
384 名前:デフォルトの名無しさん mailto:sage [05/03/13 01:50:07 ] > POD型の場合でもレジスタを余計に必要としたりね。 は?
385 名前:デフォルトの名無しさん [05/03/13 03:26:57 ] 今 typeof が使えるコンパイラって g++, icc の他にどんなのがある? typeofなんてぶっちゃけ template つかってないと殆ど使わんだろうしここでいいよね。
386 名前:デフォルトの名無しさん mailto:sage [05/03/13 09:54:26 ] RTTIとテンプレートはあまり関係ないだろうと思いつつ、 ほとんどのメジャーなコンパイラは扱えますよ。
387 名前:デフォルトの名無しさん mailto:sage [05/03/13 09:57:05 ] typeidじゃないよ。
388 名前:デフォルトの名無しさん mailto:sage [05/03/13 12:31:23 ] メジャーじゃないコンパイラは"ほとんど"に含まれない言葉のトリック
389 名前:デフォルトの名無しさん mailto:sage [05/03/13 13:47:16 ] そういうもんだいではない
390 名前:デフォルトの名無しさん mailto:sage [05/03/13 17:59:47 ] #define FOR_EACH(RANGE, ITERATOR) \\ for(boost::range_iterator::< typeof(RANGE) >::type ITERATOR \\ = boost::begin(RANGE); \\ ITERATOR != boost::end(RANGE); \\ ++ITERATOR) int a[3] = {1, 2, 3}; FOR_EACH(a, it){ cout << *it << endl; }
391 名前:デフォルトの名無しさん mailto:sage [05/03/13 18:00:22 ] struct plus { template<class LHS, class RHS> typeof(l + r) operator()(LHS const &lhs, RHS const &rhs) const{ return lhs + rhs; } private: LHS l; RHS r; };
392 名前:デフォルトの名無しさん mailto:sage [05/03/13 18:15:58 ] 391間違えました.スレ汚してすいません template<LHS, RHS> struct plus_result{ typedef typeof(l + r) type; private: LHS l; RHS r; }; struct plus { template<class LHS, class RHS> typename plus_result<LHS, RHS>::type operator()( LHS const &lhs, RHS const &rhs) const { return lhs + rhs; } };
393 名前:デフォルトの名無しさん mailto:sage [05/03/13 18:17:47 ] typeof って何で標準に入る予定ないの?
394 名前:デフォルトの名無しさん mailto:sage [05/03/13 18:21:14 ] 最初からplus_resultのとこにtypeofを書けばいいような?
395 名前:デフォルトの名無しさん mailto:sage [05/03/13 20:16:10 ] >>393 そんなこと誰が言ったんだ?
396 名前:デフォルトの名無しさん mailto:sage [05/03/13 22:50:55 ] 条件Aに適合する場合にBを適用するという意味で apply_if を書いてみたのですが、駄目だしをお願いします。 template <typename IIte, typename CheckPred, typename ApplyPred> void apply_if(IIte begin, IIte end, CheckPred check, ApplyPred apply) { for(;begin!=end;++begin) { if(check(*begin)) apply(*begin); } }
397 名前:デフォルトの名無しさん mailto:sage [05/03/13 23:18:26 ] >>396 じゃ遠慮なく。 ・名前の省略するな。(×IIte → ○InputIterator) ・Pred は predicate(述語) の略なので、 bool を返す関数以外には使うな。(×ApplyPred → ○UnaryFunction) ・*begin が繰り返されているのは良くない。 ・std::for_each() に倣って UnaryFunction を戻り値としたほうがいいかもしれない。
398 名前:デフォルトの名無しさん mailto:sage [05/03/14 00:29:28 ] >>397 細かいことを言えば、 InputIterator に apply はまずい。 InputOutputIterator じゃ長いけど。
399 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:03:01 ] とりあえず試しに Visual C++ Toolkit 2003 を使ってみたけど、 typeof() は使えない模様。__typeof とかなんかあったりするのかな?
400 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:06:34 ] >>398 イテレータのコンセプトを表すという意味で InputOutputIterator はありえない。 出力も兼ねると言うことなら、現行の規格では ForwardIterator が候補になるだろう。 しかしここも std::for_each() に倣って InputIterator とするのが正解だろう。
401 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:13:19 ] なんなんだよ、typeof()って? 初めて聞いたぞ。 type_infoクラスとtypeid演算子ならC++にあるけど、 typeof()は何をするためのもの?
402 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:21:18 ] >>401 まず最初に言っておくと、typeofは今のところまだ標準には無い。 で、まぁ名前の如く変数の型を得る演算子(?)の事。 Type a; typeof(a) b = a; みたいに使える。 この例では a の型が分かってるけど、Expression Template なんかの場合はどえらい事になっちゃうっしょ。 って分かりにくいかなぁ。誰か分かりやすい例キボンヌ。
403 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:27:44 ] その程度だとtypeid, type_infoとどう使い方が違うのか見えんな。
404 名前:デフォルトの名無しさん mailto:sage [05/03/14 01:29:18 ] テンプレート宣言の template<typename HOGE> を適宜、 template<typename HOGE, typename PLUS_TYPE> にすれば回避できるんじゃないの? 曖昧さの解決にもなるし。 というか、C++とtypeof()は相性が最悪な気がする。 多重継承さえ嫌がる人が多いというのに、 typeof()は、無駄にデバッグ作業を増やさせるだけではないか?