1 名前:デフォルトの名無しさん [2009/01/19(月) 21:22:22 ] 過去スレ part 6 pc11.2ch.net/test/read.cgi/tech/1207749841/ part 5 pc11.2ch.net/test/read.cgi/tech/1192662575/ part 4 pc11.2ch.net/test/read.cgi/tech/1175663346/ part 3 pc11.2ch.net/test/read.cgi/tech/1158991211/ part 2 pc8.2ch.net/test/read.cgi/tech/1139313234/ part 1 pc8.2ch.net/test/read.cgi/tech/1091198276/ ■関連サイト■ Boost C++ Libraries www.boost.org/ Boost 翻訳プロジェクト boost.cppll.jp/HEAD/ Let's Boost www.kmonos.net/alang/boost/ boost info shinh.skr.jp/boost/
159 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:17:56 ] boost::lambda::bindで下のコードがコンパイルエラーとなります。 (1)のところを la::bind(&human::use, man, la::var(t))(); としても同じでした。 因みにboost::bindを使用した場合は bind(&human::use, man, ref(t))(); とするとコンパイルエラーが発生しないようになりました。 lambda::bindを使用した場合にでるコンパイルエラーを回避する方法はないでしょうか? 環境:WinXP, VC8, boost1.38.0 // main.cpp #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include "create.hpp" #include "human.hpp" #include "tool.hpp" namespace la = boost::lambda; int main() { human man; tool* t(create_tool()); // toolは抽象クラス la::bind(&human::use, man, t)(); // -----(1) delete t; }
160 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:18:48 ] 長いので分割失礼します。 // human.cpp 略... void human::use(tool* t) { t->hoge(); } 略... // tool.hpp class tool { 略... virtual void hoge() = 0; 略... [コンパイル] main.cpp \XXX\boost/tuple/detail/tuple_basic.hpp(419) : error C2259: 'tool' : 抽象クラスをインスタンス化できません。 次のメンバが原因です: 'void tool::hoge(void)' : は抽象型です \YYY\tool.hpp(6) : 'tool::hoge' の宣言を確認してください。
161 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:55:08 ] 突然ですが、おまえらに問いたい! boostのイメージカラーは何色?
162 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:01:09 ] マ板でやれ
163 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:03:29 ] >>161 失せろクズ
164 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:48:39 ] >>161 二度とくんなカスが
165 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:49:15 ] >>161 VIPでやれ
166 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:53:55 ] ここまで俺の自演
167 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:12:16 ] >>159 create_toolの中は?
168 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:21:11 ] >>162 〜166 オメーも反応すんなヴォケ しかも一人で無駄に投稿すんな。
169 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:23:56 ] 159です。 >> 167 // create.cpp class hammer : public tool { public: 略... void hoge() { // 実装 } 略... }; tool* create_tool() { return new hammer; } といった感じです。 toolの具象クラスのhammerは表に出ないようになっています。
170 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:17:28 ] >>169 とりあえずboost::refをつけたら、こっちではコンパイル通った la::bind(&human::use, boost::ref(man), t)(); // -----(1) GCC 4.0.1, boost 1.38.0
171 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:59:16 ] 159です。 >>170 確かに void human::use(tool*); ならそれで通りますね。ありがとうございます。 私の実際のコードでは void human::use(tool&); となっていまして、教えて頂いたようにしても同じコンパイルエラーが発生してしまいます。
172 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 07:01:49 ] >>171 *と&はまったく違う意味だぞ。 そこで一時オブジェクトを作ろうとしてエラーになってるんじゃないのかconst tool&にしてみろ
173 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:59:28 ] 159です。 >>172 void tool::hogeがconstでないのでtool const&とはできません。 一度実際のコードを載せてみます。 // create.hpp #pragma once struct tool; tool* create(); // create.cpp #include <iostream> #include "create.hpp" #include "tool.hpp" using namespace std; struct hammer : tool { void effect() { cout << "gotin\n": } tool* create() { return new hammer; } // human.hpp #pragma once struct tool; struct human { void use(tool& t); } // human.cpp #include "human.hpp" #include "tool.hpp" void human::use(tool& t) { t.effect(); }
174 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 10:00:01 ] // tool.hpp #pragma once struct tool { virtual ~tool() throw() {} virtual void effect() = 0; }; // main.cpp #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include <memory> #include "create.hpp" #include "human.hpp" #include "tool.hpp" using namesace boost; using namespace std; namespace la = lambda; int main() { auto_ptr<tool> t(create()); human man; la::bind(&human::use, la::var(man), la::var(*t))(); }
175 名前:デフォルトの名無しさん [2009/02/25(水) 11:30:52 ] struct pred { pred(int){}; ←(A) void operator()(int v) const { std::cout << v << "\n"; } }; boost::function_output_iterator<pred> fi(pred(0));←こうするには(A)が必要 boost::function_output_iterator<pred> fi(pred());←(A)を消してこう書くことができない←(B) std::vector<int> v(boost::counting_iterator<int>(0),boost::counting_iterator<int>(10)); std::copy(v.begin(), v.end(), fi);←(B)だとここでエラー std::copy(v.begin(), v.end(), boost::make_function_output_iterator(pred()));←これだと(A)がなくてもOK make_function_output_iteratorは(B)と同じことしているんじゃないの?
176 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 12:25:21 ] const tool&を使わずに抽象クラスを渡すには、どうにかしてコピー可能にする必要がある。 tool*を使うか、ref(t)で渡す。
177 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 13:16:26 ] 159です。 >>176 tool*でならmain.cppの最終行を la::bind(&human::use, la::var(man), t.get())(); としてやれば良いのですが tool&をhuman::useの引数にすると la::bind(&human::use, la::var(man), la::var(*t))(); は、やはりエラーとなりますね。 la::bind(&human::use, la::var(man), boost::ref(*t))(); としてもエラーです。 腑に落ちないのが boost::bind(&human::use, boost::ref(man), boost::ref(*t))(); ならコンパイルが通ること。 lambdaの内部を追っているわけではないのでなんともいえませんが、 ユーザからすると、この動作は奇妙に思えます。 boost::bindとboost::lambda::bindは互換性があると勝手に思っていたの で意外です。 boost::cref => boost::lambda::constant_ref boost::ref => boost::lambda::var という理解も間違っているのでしょうか?
178 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 14:13:20 ] main.cpp \XXX\boost/tuple/detail/tuple_basic.hpp(419) : error C2259: 'tool' : 抽象クラスをインスタンス化できません。 次のメンバが原因です: 'void tool::hoge(void)' : は抽象型です \YYY\tool.hpp(6) : 'tool::hoge' の宣言を確認してください。 とでてるので、抽象クラスをやめたら la::bind(&human::use, man, (*t); でエラーにならない。 lambda::bindのどっかで抽象クラスをインスタンスかしようとしてるんだろう
179 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 14:15:02 ] マニュアル読む限り boost::ref => boost::lambda::var は間違ってると思う。 boost::ref は参照型だけど、lambda::var は参照じゃない
180 名前:179 mailto:sage [2009/02/25(水) 14:34:38 ] >>179 すまん、間違ってた。 やっぱ参照みたい。
181 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 15:05:38 ] boost.cppll.jp/HEAD/libs/lambda/doc/ar01s04.html
182 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 17:31:50 ] 159です。 >>181 そのページは私も読みました。 boost::refはboost::lambda::varに置き換えられると理解しております。 >>178 でしょうね。 しかし、実装上の事情はどうであれ、インタフェースとしては抽象クラスの参照を bindの引数にすることを可能としていなければいけないように思えます。 何か回避策がlambdaにあるのではと思うのですが直ぐには見つけられませんね。 ご存知の方いないでしょうか?
183 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 17:55:58 ] la::bind(&human::use, la::var(man), la::var(boost::ref(*t)))(); でどうか?
184 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 17:57:52 ] >>182 抽象クラスはインスタンス化できない。それをしようとしているからエラーになる。 テンプレートの引数に参照で渡したいときはref( )を使えば参照が渡せる。
185 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:05:31 ] >>182 >>159 >bind(&human::use, man, ref(t))(); boost::bind できるんなら、boost::lambda::bindにこだわる必要ないでしょう
186 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:10:46 ] bindのプレースホルダによる汚染が怖いとかじゃないんでしょうか
187 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:25:05 ] 159です。 >>183 目から鱗ですね。 それでいけました。 ありがとうございます。 >>185 boost::bindとboost::lambda::bindの混在は面倒なトラブルが発生することが あるので避けています。 皆さんありがとうございました。 他にもスマートな方法があればお教え頂きたいと思います。
188 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:27:25 ] >>183 それでいける理由が知りたい
189 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:44:07 ] 簡単に言うならreference_wrapperとidentityにより型の解決が遅延されて、 早期の解決によって束縛される値が参照型から値型になってしまうことを防ぐことができるから かなぁ
190 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 21:07:02 ] lists.boost.org/boost-users/2005/07/12450.php
191 名前:デフォルトの名無しさん [2009/02/26(木) 16:50:17 ] 「参照型から値型がになってしまう」とはどんな具体的にどんな状況ですか? できれば最小のサンプルソースが見たいです。
192 名前:デフォルトの名無しさん [2009/02/26(木) 16:51:37 ] >>189 「参照型から値型がになってしまう」とは具体的にどんな状況ですか? できれば最小のサンプルソースが見たいです。 typo があったので再投稿。
193 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 18:09:02 ] まだtypoがある件
194 名前:189 mailto:sage [2009/02/26(木) 19:39:19 ] >>191 一言で言えば、remove_referenceを使えばそうなる。 以下、var(ref(*t))で上手くいくかの理由の大まかに解説する remove_referenceはメタ関数deduce_non_ref_argument_typesで使われている、 このメタ関数はlambda_functor_baseが具現化される際に、束縛する値の型を保持する為のタプルの型の要素に対して適用される。 なのでvar(ref(*t))以外での渡し方をすると型計算の結果、tool&やconst tool&を要素として持つタプルの型が生成される。 するとtupleを構成する型に抽象型toolが含まれてしまい、tupleを実体化するときにtoolを実体化しようとしてエラーになる。 実際はtupleはconsで実装されているのでコンパイルエラーはconsのheadメンバの宣言の時点で発生する。 そこでduduce_(ryの時点でreference_wrapper<tool>になるようにしてremove_referenceを防ぐためにboost::ref()を使うわけだけど、 boost::refだけだとbindに渡された時点でbind_tuple_mapper内での型の解決によりtool&型になってしまうので、それを防ぐためにvar()を使う。 すると問題になっているtupleの要素の型はdeduce(ryを経てもidentity<reference_wrapper<tool> >のままになり、 結果boost::lambda::bindの返す関数オブジェクトはこの関数オブジェクトをそのままtupleの要素として保持することになる。 そしてこのidentity<reference_wrapper<tool> >は生成した関数オブジェクトが呼び出される際、つまりoperator()が解決されるときに、 identity、reference_wrapperの解決を経てtool&として解決される。 要するに>>189 というわけだ。 これ以上詳しく知りたければboostのコード読んでください。
195 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:28:29 ] 乙
196 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 22:01:56 ] 更新しました。今週はソースの追加や削除が多いです。 ビルド用の設定ファイルもチューニングされ、今迄フルビルドに1時間弱掛かっていたのが20分に超高速化されました。 ttp://booster.x0.to/ 以下更新内容の一部 [Gil] GIL: fixed Ticket 784: Wrong initilization of data members in packed_pixel constructors [Utility] Fixed const issue of value_initialized according to ticket #2548. [Functional] adds missing template parameters for partial specialisations Fix the hash dirname. [Serialization] fixed namespace [Archive] permit start/end load/save to be overridable [Fusion] updates functional module: only two unfused variants, now Fix: remove non-existent test [Random] Initialize _modulus in the linear_congruential constructor that takes a pair of iterators. Fixes #2665 [Unordrered] Make copy_buckets and move_buckets member functions - so that calling them is a bit simpler. Move some of the data structure classes out of hash table data. [Config] Merge branches/cpp0x into trunk, enabling a bunch of BOOST_NO_* macros for C++0x early adopter feature tests [Math] Merges changes from Sandbox version: MPFR Support. New distributions: laplace, logistic and hypergeometric. Added C# usage example.
197 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 01:30:27 ] >今迄フルビルドに1時間弱掛かっていたのが20分に超高速化されました マジかよwwwww
198 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:06:36 ] RubyのModule的なことをしたいんだけど可能? 関数を用意しておいて他のクラスにその関数をメンバとして追加したいです。 Rubyのコードだと以下のようになります。 module MyModule def extend_function print "extend_function\n" end end class MyClass include MyModule end object=MyClass.new object.extend_function
199 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:10:56 ] C++0xスレで拡張メソッドが話題になったばかりだから覗いてみるといいかな
200 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 03:21:34 ] >198 struct MyModule { void extend_function() { // …… }; }; class MyClass : public MyModule {}; 派生クラスを操作する必要がある場合は template<typename T> struct MyPolicy { MyPolicy& self() { return *(static_cast<MyPolicy*>(this)); }; void extend_function() { // …… }; }; class MyClass : public MyPolicy<MyClass> {};
201 名前:200 mailto:sage [2009/03/02(月) 03:22:29 ] あ、間違えた template<typename T> struct MyPolicy { MyPolicy& self() { return *(static_cast<T*>(this)); }; void extend_function() { // …… }; };
202 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 04:05:44 ] >>201 selfの戻り値もT&だろ。
203 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 09:50:38 ] 大元のclass MyClassの記述を変更せずに、という(多分)そもそもの目的に外れるのでは。 何か便利な文字列操作メソッドを追加したいとかで使うんだろうけど、 std::string弄るわけにはいかないし。
204 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:34:46 ] 思ったんだけどstructとclassの違いって何だろう?
205 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:37:18 ] >>204 継承とメソッドのデフォルトがpublicかprivateかの違いだけ
206 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:42:52 ] Boost.Iterator使ってイテレータ作るときのオブジェクトはstructにしないとコンパイルエラー出るな デフォルト継承の問題のようだが
207 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 20:36:56 ] >206 つ friend class boost::iterator_core_access;
208 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:25:08 ] ARM用にクロスコンパイルができない。bjamで正しく設定すればコンパイル通るのか
209 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:44:20 ] 更新しました。 ttp://booster.x0.to/ 以下更新内容の一部 [Config] config: add cpp0x files not added after merge config: fix both BOOST_HAS_LONG_LONG and BOOST_NO_LONG_LONG getting defined at the same time for some compilers [Math] Add option to disable use of std::fpclassify. Fix for no long double support. [Bind] Make bind.hpp and mem_fn.hpp forward to bind/bind.hpp and bind/mem_fn.hpp. (Ref #2238) [Unordered] Add missing return for operator=. [Smart_ptr] Move smart_ptr into boost/smart_ptr/*.hpp (refs #2239). Fix enable_shared_from_this-related tickets in trunk. Refs #2126. Refs #2584. [Signals2] Merged Signals2 from sandbox to trunk. [Graph] Fix: Avoid compiler warning if BOOST_NO_HASH is already defined.
210 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 23:57:23 ] あのーーー >>209 にうpされてるのVC2005では使えないんですか?
211 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 00:47:58 ] VC2008SP1でビルドしておりますので、VC2005では恐らく使えないと思います。 次回からその旨分かる様に、ファイル名に"VC2008"を追加致します。
212 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 00:53:37 ] >>211 そうなんですか、同じコンパイラメーカーのでもバージョン違うと駄目なんですか,orz
213 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 04:54:22 ] >212 少し古いバージョンで良いならこっから落とせるよ。 2003, 2005, 2008 用をインストール時に選択可能。 ttp://www.boostpro.com/products/free
214 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 09:40:22 ] コンパイラによって関数の対応状況変わるから調べたほうがいいよ
215 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:57:29 ] 最近はヘッダファイルをジャンルごとにディレクトリ切るように移行中なのか。 あとspirit使うとclassicのヘッダファイル使えと警告出るんだけど、classicじゃないspiritの使い方って どっかに書いてあるんだろうか・・・(公式ドキュメントも前のまんまだった)
216 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:05:58 ] >>215 spiritはV2になるから準備じゃないか?今のマニュアルがclassicに相当するようだ。 俺も最近spirit始めたところで悩んだ。 classicヘッダは名前空間がclassicに変わってるから注意だ
217 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:47:14 ] すでに自己解決した問題なんだけど、ぐぐっても日本語の情報が見つからなかったので、垂れ流しておきます。 環境依存(MinGW)っぽい話で、ここに書くべきか分かりませんが。自分の環境は OS: Windows XP (Home Edition, SP2) コンパイラ: gcc version 3.4.5 (mingw-vista special r3) boost 1.38.0 <boost/date_time/filetime_functions.hpp> がインクルードされるときに以下の警告が出ます。 > (略)/boost/date_time/filetime_functions.hpp:101: warning: left shift count >= width of type この警告は、該当のファイルの99行目と100行目の UL を ULL に書き換えると出なくなります。 書き換え前 > const uint64_t c1 = 27111902UL; > const uint64_t c2 = 3577643008UL; 書き換え後 > const uint64_t c1 = 27111902ULL; > const uint64_t c2 = 3577643008ULL; こういう解決法でいいのか、よく分かりませんが。今のところ Boost Trac のTicket #2809で報告されています。
218 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:59:34 ] > const uint64_t c1 = UINT64_C(27111902); > const uint64_t c2 = UINT64_C(3577643008); じゃ駄目なの?
219 名前:217 mailto:sage [2009/03/13(金) 16:26:19 ] >>218 そっちのほうが良さそうですね。(そのマクロは初めて知りました) 私の環境では、マクロ __STDC_CONSTANT_MACROS を自分で定義しないとUINT64_Cが使えませんでしたが、 定義するとうまく行きました。後の人の参考までに。
220 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 17:54:45 ] 更新しました。 ttp://booster.x0.to/ 以下更新内容の一部 [Signals2] some inspect cleanups (mostly getting rid of tabs). Finally fixed some odd test errors on msvc9. [Smart_ptr] De-optimize assignment into this_type(r).swap(*this) Attempt to fix como link failure. [Functional] Move hash_fwd into the hash subdirectory. Remove deprecated headers. [Math] Misc. small platform specific fixes and expected error rate adjustments. [Fusion] Protected unused_type by an ADL barrier [Numeric] added unit test for LU decomposition add new constructor from vector to permutation matrix [Serialization] checked in new type trait - is_virtual_base_of.hpp Try new version of is_virtual_base_of.hpp [Wave] Wave: now compiles even with BOOST_FILESYSTEM_NO_DEPRECATED defined [Typeof] BOOST_TYPEOF_NESTED_TYPEDEF now supports expressions containing "this" for VC compilers [Detail] Initial commit. [Config] Added configuration macros BOOST_NO_AUTO_DECLARATIONS and BOOST_NO_AUTO_MULTIDECLARATIONS. [Function] 60% speedup on a micro-benchmark that copies and calls such function objects repeatedly.
221 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 00:17:11 ] boost1.36.0を使っているのですが、ファイルの絶対パスから相対パスを取得する良い方法は何か無いでしょうか…?
222 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 00:29:11 ] あれ?relative_path()ってまさにそのためのメソッドじゃなかったっけ?
223 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 17:05:03 ] ublasにqr分解する関数ないですか? lu分解はあるようなんですけど
224 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 18:58:20 ] >>223 「ublas qr分解」で検索すると、boost.ublasで実装した例が見つかるくらいだから、 直接qr分解するような関数はないんじゃね?
225 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 13:45:04 ] pythonのc apiが変更になるみたいだけど boost.pythonは対応してくれるんだろうか 特に日本語文字列を渡せるかあたりが変わるとか
226 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 15:24:07 ] この機会にLuaとかSquirrelとかに移行してみるというのはどうだろう。 いやもちろん用途次第だけど。
227 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 15:46:02 ] v8でJavaScriptとか・・・ 試してみたらかなり楽に使えたんでびっくりした
228 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:49:16 ] >>226 Boost.Luaとか期待しています。
229 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 18:07:26 ] pythonってライブラリのサポート率が凄く高いんだよね。 だから簡単に他に移行するのは、結構難しいんじゃないかな。
230 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 09:20:09 ] じゃあ俺はBoost.AngelScriptを期待。
231 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 18:54:29 ] 更新しました。 ttp://booster.x0.to/ 以下更新内容の一部 [Type_traits] Add is_virtual_base_of. Add extra tests for is_base_of to test virtual inheritance. [Math] Add instrumentation code and some FPU control options. Updated the sign functions to use Johan Rade's fp-utilities code. [Serialization] Use new is_virtual_base_of [Config] Revert 51733 - it broke the regression testing system [Proto] work around issue with <termios.h> #define'ing B0 add proto::noinvoke to block metafunction invocation in ObjectTransforms [Tuple] fixed tuples::length not having a specialization for const tuple<> and const null_type
232 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:16:11 ] 以下のコードでVC++2005だとエラーは出ませんがIntelC++11だと「オペランドの型に互換性がありません ("boost::foreach_detail_::rvalue_probe<const ListInt>" と "const ListInt")」というエラーが出ます。どうしたら回避できるんでしょうか? #include <boost/foreach.hpp> #include <list> typedef std::list<int> ListInt; int _tmain(int argc, _TCHAR* argv[]) { ListInt A; ListInt& B=A; const ListInt& C=A; BOOST_FOREACH(const int& i,B) { } BOOST_FOREACH(const int& i,C) //ここでエラー { } return 0; }
233 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 09:12:24 ] まったくの勘で物をいってすまないが、 BOOST_FOREACH(int const& i,C) とかでだめかな?
234 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 09:35:01 ] BOOST_FOREACH(const int& i,C) も BOOST_FOREACH(int const& i,C) も同じ意味
235 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 09:37:23 ] そもそもconst int&でなくintにしてみたらどうだろう。 それでだめならforeachの実装覗くしかないんじゃね。
236 名前:デフォルトの名無しさん [2009/03/21(土) 12:06:26 ] class step_iterator : public boost::iterator_facade<step_iterator,int , boost::bidirectional_traversal_tag> { public: explicit step_iterator(int v, int s = 1):value(v), step(s){} private: friend class boost::iterator_core_access; void increment() { value += step; } void decrement() { value -= step; } int& dereference() const { return value; } bool equal(const step_iterator& other) const { return value >= other.value; } int value; int step; };
237 名前:236 [2009/03/21(土) 12:07:13 ] >>236 int に対する iterator で increment でstepずつ増やす iterator を 作ってみてるのですが、dereference() の箇所で error C2440: 'return' : 'const int' から 'int &' に変換できません。 とエラーになってしまいます。 メンバーのvalueをintへのポインターにして、dereference()で*valueを 返す様にしたら期待した動作をしてくれます。 また、const_cast しても期待した動作になります・・・ なぜ、int では駄目なのでしょうか?
238 名前:デフォルトの名無しさん [2009/03/21(土) 12:46:15 ] d.hatena.ne.jp/electrolysis/20090220/1235059204 ここのUDP通信のソースで質問なんだけど、 send_to()ではIPとポート指定してるのに、 何故recv_from()では必要無いんですか? boost::asio::ip::udp::socket がIPとかを記録するんじゃないかと思ったんだけど、 リファレンスマニュアル見ても明確に書いてなかった
239 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:32:08 ] >>236 メンバ関数のconst外す or 戻り値にconst付ける >>238 郵便を送るには送り先住所が必要ですが、受け取るにはポストを設置しておけばいいだけです。 receive_fromに渡しているendpointは差出人の住所を受け取るためのバッファです。 ちなみにそのページの非同期コードは未定義だね。
240 名前:デフォルトの名無しさん [2009/03/21(土) 15:00:11 ] >>239 >>戻り値にconst付ける error C2440: 'return' : 'const int' から 'int &' に変換できません。 >>メンバ関数のconst外す error C2662: 'step_iterator::dereference' : 'const step_iterator' から 'step_iterator &' へ 'this' ポインタを変換できません。 iterator_core_access::dereference が static typename Facade::reference dereference(Facade const& f) { return f.dereference(); } だから const はずせないです。
241 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:04:38 ] >237 > int& dereference() const const メンバ関数なので this は const step_iterator*。 従って、メンバの value も const int になります。 これは変更不可能なので、変更可能な参照 int& として返すことができません。 value を int* にした場合は、int * const になり、ポインタ値としては const ですが、 指している int の値は変更可能なので int& にできます。 > public boost::iterator_facade<step_iterator,int , boost::bidirectional_traversal_tag> > int& dereference() const ではなくて > public boost::iterator_facade<step_iterator,const int , boost::bidirectional_traversal_tag> > const int& dereference() const でどうでしょう?
242 名前:デフォルトの名無しさん [2009/03/21(土) 15:18:52 ] >>241 うまくいきました。 dereference()して値を変えたい場合は、ポインターなどにしてやる必要があるんですね。 >const メンバ関数なので this は const step_iterator*。 >従って、メンバの value も const int になります。 >これは変更不可能なので、変更可能な参照 int& として返すことができません 調べてると、「mutableでないと駄目」とか書いてあったけど、↑のことだったのか・・・
243 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 15:58:49 ] >>238 recv_fromはbindでポートと結びついてるソケットで読み込んでるからでないの?
244 名前:238 [2009/03/21(土) 16:17:09 ] >>239 UDPでは(?)どのポートに来たメッセージも受信できちゃうってことですか? >>243 bind()ではポート番号とか渡してないみたい
245 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 18:27:28 ] >244 send_toの時にバインドされてる
246 名前:238 mailto:sage [2009/03/22(日) 08:53:20 ] >>245 やっぱそうなのか この辺で失礼します。ありがとう
247 名前:デフォルトの名無しさん [2009/03/22(日) 18:01:34 ] vc2008EE sp1 winxp boost1.38(boostpro)で int x = 1, y = 10; (boost::lambda::_1 + boost::lambda::protect(boost::lambda::_1 + 2))(x)(y); がコンパイル通らないんだけど、なんで? error C2664: 'boost::lambda::lambda_functor<T>::lambda_functor(const boost::lambda::lambda_functor<T> &)' : 1 番目の引数を 'const boost::lambda::lambda_functor<T>' から 'const boost::lambda::lambda_functor<T> &' に変換できません。
248 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 18:57:14 ] とりあえず解決法だけ (x)を(boost::cref(x))にする(refでもおk) gcc-4.4, boost trunkで動作確認できた
249 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 21:42:42 ] Boostライブラリって同じ機能・もしくはちょっと違う機能のついた別クラスが 多い. こういうとこ改善しないのかな?
250 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 21:59:52 ] >>249 具体的にどれのこと?全部挙げなくて良いからさ。 あと、改善しないのか気になるんなら、直接提案してみれば良いよ。
251 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:22:20 ] 249じゃないけど、bindとlambda::bindとかtupleとfusionとか これまで書かれたコードがあるから一本化できないんだろ どっちかが非推奨になることはあるかもしれんが boostのライブラリは便利だけど、組み合わせようとするとあれ?ってなる感じがする。 lambdaはresult_ofに対応したんだっけ?
252 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:33:56 ] boost/functionを使うときにはたいていboost/bindも使うとか 文字列処理クラスが機能かぶってるとかのことを言ってるのか? おれは↑と他ちょっとしかboostしないから知らないけどなんかあんの?
253 名前:247 [2009/03/22(日) 22:46:02 ] boost::protect の一番わかりやすい(シンプルな) サンプルコード教えてください。 (boost::protectの有無で結果変わるやつ)
254 名前:232 mailto:sage [2009/03/24(火) 22:59:56 ] >>233-235 直らなかったので、ソースを調べました。 コンパイラのバージョンチェックがまずかったようです。 boost/foreach.hppの頭のほうの行の || BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 810) を、以下のように変えたらコンパイラが通りました。 || BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 1100) とりあえず、これで様子見です。