Boost総合スレ part7
..
191:デフォルトの名無しさん
09/02/26 16:50:17
「参照型から値型がになってしまう」とはどんな具体的にどんな状況ですか?
できれば最小のサンプルソースが見たいです。
192:デフォルトの名無しさん
09/02/26 16:51:37
>>189
「参照型から値型がになってしまう」とは具体的にどんな状況ですか?
できれば最小のサンプルソースが見たいです。
typo があったので再投稿。
193:デフォルトの名無しさん
09/02/26 18:09:02
まだtypoがある件
194:189
09/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:デフォルトの名無しさん
09/02/26 23:28:29
乙
196:デフォルトの名無しさん
09/02/27 22:01:56
更新しました。今週はソースの追加や削除が多いです。
ビルド用の設定ファイルもチューニングされ、今迄フルビルドに1時間弱掛かっていたのが20分に超高速化されました。
URLリンク(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:デフォルトの名無しさん
09/02/28 01:30:27
>今迄フルビルドに1時間弱掛かっていたのが20分に超高速化されました
マジかよwwwww
198:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/01 10:10:56
C++0xスレで拡張メソッドが話題になったばかりだから覗いてみるといいかな
200:デフォルトの名無しさん
09/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
09/03/02 03:22:29
あ、間違えた
template<typename T>
struct MyPolicy {
MyPolicy& self() { return *(static_cast<T*>(this)); };
void extend_function() {
// ……
};
};
202:デフォルトの名無しさん
09/03/02 04:05:44
>>201
selfの戻り値もT&だろ。
203:デフォルトの名無しさん
09/03/02 09:50:38
大元のclass MyClassの記述を変更せずに、という(多分)そもそもの目的に外れるのでは。
何か便利な文字列操作メソッドを追加したいとかで使うんだろうけど、
std::string弄るわけにはいかないし。
204:デフォルトの名無しさん
09/03/02 13:34:46
思ったんだけどstructとclassの違いって何だろう?
205:デフォルトの名無しさん
09/03/02 13:37:18
>>204
継承とメソッドのデフォルトがpublicかprivateかの違いだけ
206:デフォルトの名無しさん
09/03/02 13:42:52
Boost.Iterator使ってイテレータ作るときのオブジェクトはstructにしないとコンパイルエラー出るな
デフォルト継承の問題のようだが
207:デフォルトの名無しさん
09/03/02 20:36:56
>206
つ friend class boost::iterator_core_access;
208:デフォルトの名無しさん
09/03/03 21:25:08
ARM用にクロスコンパイルができない。bjamで正しく設定すればコンパイル通るのか
209:デフォルトの名無しさん
09/03/06 22:44:20
更新しました。
URLリンク(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:デフォルトの名無しさん
09/03/06 23:57:23
あのーーー
>>209にうpされてるのVC2005では使えないんですか?
211:デフォルトの名無しさん
09/03/07 00:47:58
VC2008SP1でビルドしておりますので、VC2005では恐らく使えないと思います。
次回からその旨分かる様に、ファイル名に"VC2008"を追加致します。
212:デフォルトの名無しさん
09/03/07 00:53:37
>>211
そうなんですか、同じコンパイラメーカーのでもバージョン違うと駄目なんですか,orz
213:デフォルトの名無しさん
09/03/07 04:54:22
>212
少し古いバージョンで良いならこっから落とせるよ。
2003, 2005, 2008 用をインストール時に選択可能。
URLリンク(www.boostpro.com)
214:デフォルトの名無しさん
09/03/07 09:40:22
コンパイラによって関数の対応状況変わるから調べたほうがいいよ
215:デフォルトの名無しさん
09/03/08 14:57:29
最近はヘッダファイルをジャンルごとにディレクトリ切るように移行中なのか。
あとspirit使うとclassicのヘッダファイル使えと警告出るんだけど、classicじゃないspiritの使い方って
どっかに書いてあるんだろうか・・・(公式ドキュメントも前のまんまだった)
216:デフォルトの名無しさん
09/03/08 15:05:58
>>215
spiritはV2になるから準備じゃないか?今のマニュアルがclassicに相当するようだ。
俺も最近spirit始めたところで悩んだ。
classicヘッダは名前空間がclassicに変わってるから注意だ
217:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/13 15:59:34
> const uint64_t c1 = UINT64_C(27111902);
> const uint64_t c2 = UINT64_C(3577643008);
じゃ駄目なの?
219:217
09/03/13 16:26:19
>>218
そっちのほうが良さそうですね。(そのマクロは初めて知りました)
私の環境では、マクロ __STDC_CONSTANT_MACROS を自分で定義しないとUINT64_Cが使えませんでしたが、
定義するとうまく行きました。後の人の参考までに。
220:デフォルトの名無しさん
09/03/13 17:54:45
更新しました。
URLリンク(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:デフォルトの名無しさん
09/03/16 00:17:11
boost1.36.0を使っているのですが、ファイルの絶対パスから相対パスを取得する良い方法は何か無いでしょうか…?
222:デフォルトの名無しさん
09/03/16 00:29:11
あれ?relative_path()ってまさにそのためのメソッドじゃなかったっけ?
223:デフォルトの名無しさん
09/03/17 17:05:03
ublasにqr分解する関数ないですか?
lu分解はあるようなんですけど
224:デフォルトの名無しさん
09/03/17 18:58:20
>>223
「ublas qr分解」で検索すると、boost.ublasで実装した例が見つかるくらいだから、
直接qr分解するような関数はないんじゃね?
225:デフォルトの名無しさん
09/03/18 13:45:04
pythonのc apiが変更になるみたいだけど
boost.pythonは対応してくれるんだろうか
特に日本語文字列を渡せるかあたりが変わるとか
226:デフォルトの名無しさん
09/03/18 15:24:07
この機会にLuaとかSquirrelとかに移行してみるというのはどうだろう。 いやもちろん用途次第だけど。
227:デフォルトの名無しさん
09/03/18 15:46:02
v8でJavaScriptとか・・・
試してみたらかなり楽に使えたんでびっくりした
228:デフォルトの名無しさん
09/03/18 17:49:16
>>226
Boost.Luaとか期待しています。
229:デフォルトの名無しさん
09/03/18 18:07:26
pythonってライブラリのサポート率が凄く高いんだよね。
だから簡単に他に移行するのは、結構難しいんじゃないかな。
230:デフォルトの名無しさん
09/03/19 09:20:09
じゃあ俺はBoost.AngelScriptを期待。
231:デフォルトの名無しさん
09/03/20 18:54:29
更新しました。
URLリンク(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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/21 09:12:24
まったくの勘で物をいってすまないが、
BOOST_FOREACH(int const& i,C)
とかでだめかな?
234:デフォルトの名無しさん
09/03/21 09:35:01
BOOST_FOREACH(const int& i,C)
も
BOOST_FOREACH(int const& i,C)
も同じ意味
235:デフォルトの名無しさん
09/03/21 09:37:23
そもそもconst int&でなくintにしてみたらどうだろう。
それでだめならforeachの実装覗くしかないんじゃね。
236:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/03/21 12:46:15
URLリンク(d.hatena.ne.jp)
ここのUDP通信のソースで質問なんだけど、
send_to()ではIPとポート指定してるのに、
何故recv_from()では必要無いんですか?
boost::asio::ip::udp::socket がIPとかを記録するんじゃないかと思ったんだけど、
リファレンスマニュアル見ても明確に書いてなかった
239:デフォルトの名無しさん
09/03/21 14:32:08
>>236
メンバ関数のconst外す or 戻り値にconst付ける
>>238
郵便を送るには送り先住所が必要ですが、受け取るにはポストを設置しておけばいいだけです。
receive_fromに渡しているendpointは差出人の住所を受け取るためのバッファです。
ちなみにそのページの非同期コードは未定義だね。
240:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/21 15:18:52
>>241
うまくいきました。
dereference()して値を変えたい場合は、ポインターなどにしてやる必要があるんですね。
>const メンバ関数なので this は const step_iterator*。
>従って、メンバの value も const int になります。
>これは変更不可能なので、変更可能な参照 int& として返すことができません
調べてると、「mutableでないと駄目」とか書いてあったけど、↑のことだったのか・・・
243:デフォルトの名無しさん
09/03/21 15:58:49
>>238
recv_fromはbindでポートと結びついてるソケットで読み込んでるからでないの?
244:238
09/03/21 16:17:09
>>239
UDPでは(?)どのポートに来たメッセージも受信できちゃうってことですか?
>>243
bind()ではポート番号とか渡してないみたい
245:デフォルトの名無しさん
09/03/21 18:27:28
>244
send_toの時にバインドされてる
246:238
09/03/22 08:53:20
>>245
やっぱそうなのか
この辺で失礼します。ありがとう
247:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/22 18:57:14
とりあえず解決法だけ
(x)を(boost::cref(x))にする(refでもおk)
gcc-4.4, boost trunkで動作確認できた
249:デフォルトの名無しさん
09/03/22 21:42:42
Boostライブラリって同じ機能・もしくはちょっと違う機能のついた別クラスが
多い.
こういうとこ改善しないのかな?
250:デフォルトの名無しさん
09/03/22 21:59:52
>>249
具体的にどれのこと?全部挙げなくて良いからさ。
あと、改善しないのか気になるんなら、直接提案してみれば良いよ。
251:デフォルトの名無しさん
09/03/22 22:22:20
249じゃないけど、bindとlambda::bindとかtupleとfusionとか
これまで書かれたコードがあるから一本化できないんだろ
どっちかが非推奨になることはあるかもしれんが
boostのライブラリは便利だけど、組み合わせようとするとあれ?ってなる感じがする。
lambdaはresult_ofに対応したんだっけ?
252:デフォルトの名無しさん
09/03/22 22:33:56
boost/functionを使うときにはたいていboost/bindも使うとか
文字列処理クラスが機能かぶってるとかのことを言ってるのか?
おれは↑と他ちょっとしかboostしないから知らないけどなんかあんの?
253:247
09/03/22 22:46:02
boost::protect の一番わかりやすい(シンプルな)
サンプルコード教えてください。
(boost::protectの有無で結果変わるやつ)
254:232
09/03/24 22:59:56
>>233-235
直らなかったので、ソースを調べました。
コンパイラのバージョンチェックがまずかったようです。
boost/foreach.hppの頭のほうの行の
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 810)
を、以下のように変えたらコンパイラが通りました。
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 1100)
とりあえず、これで様子見です。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4324日前に更新/71 KB
担当:undef