[過去ログ]
Boostを語れゴラァ part3 (1001レス)
Boostを語れゴラァ part3 http://echo.5ch.net/test/read.cgi/tech/1158991211/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
147: デフォルトの名無しさん [sage] 2006/10/19(木) 11:43:43 コンパイラか http://echo.5ch.net/test/read.cgi/tech/1158991211/147
148: デフォルトの名無しさん [sage] 2006/10/19(木) 11:46:32 >>133 VC8+boost1.33.1でもちゃんと動くね http://echo.5ch.net/test/read.cgi/tech/1158991211/148
149: デフォルトの名無しさん [sage] 2006/10/19(木) 16:25:42 >>133 VC2003で試したら落ちたのでアセンブリ出力を調べてみた。 function1<float, ublas::vector<float> > norm_2Functor = &ublas::norm_2<ublas::vector<float> >; and eax,00402fd0 ; ここがおかしい。なんでANDやねん...(00402fd0はnorm_2のアドレス) push eax ; VC8では2行あわせてpush 00402fd0だけになっている lea ecx,dword ptr [ebp-3c] call 00403040 mov byte ptr [ebp-04],01 で、norm_2Functorの宣言をこ
うしたらとりあえず動いた。 function1<float, ublas::vector<float> > norm_2Functor(&ublas::norm_2<ublas::vector<float> >); push +00 ; この00は何なんだろう… push 00402fd0 lea ecx,dword ptr [ebp-3c] call 00403040 mov byte ptr [ebp-04],01 よくわからないpush 00がとても不安だけど…(VC8ではpushはひとつだけ) http://echo.5ch.net/test/read.cgi/tech/1158991211/149
150: デフォルトの名無しさん [sage] 2006/10/20(金) 21:04:32 VS2003ではfunction1を初期化 norm_2Functor(&ublas::norm_2<ublas::vector<float> >); でしか呼べないのね。 objectの意味ねえ http://echo.5ch.net/test/read.cgi/tech/1158991211/150
151: デフォルトの名無しさん [sage] 2006/10/20(金) 21:49:33 >>150 function1<float, ublas::vector<float> > norm_2Functor(NULL); で宣言しておいてswap技法 function1<float, ublas::vector<float> >(&ublas::norm_2<ublas::vector<float> >).swap(norm_2Functor); で実際の関数を代入とか… ヤッテランネ(ノ`□´)ノ⌒┻━┻ http://echo.5ch.net/test/read.cgi/tech/1158991211/151
152: 151 [sage] 2006/10/20(金) 21:52:00 メンバ関数のswapがないから swap(norm_2Functor, function1<float, ublas::vector<float> >(&ublas::norm_2<ublas::vector<float> >)); でないと無理か そもそもできるかどうか知らんけど http://echo.5ch.net/test/read.cgi/tech/1158991211/152
153: デフォルトの名無しさん [sage] 2006/10/20(金) 22:03:06 腐ったコンパイラでなんとかしようという努力は不毛だぜ http://echo.5ch.net/test/read.cgi/tech/1158991211/153
154: デフォルトの名無しさん [sage] 2006/10/20(金) 22:38:40 >>152 そもそも一時オブジェクトをswapの引数にはできん http://echo.5ch.net/test/read.cgi/tech/1158991211/154
155: デフォルトの名無しさん [sage] 2006/10/20(金) 23:17:36 >>154 --->?swap技法? http://echo.5ch.net/test/read.cgi/tech/1158991211/155
156: デフォルトの名無しさん [sage] 2006/10/21(土) 00:24:57 中国人は帰れよ http://echo.5ch.net/test/read.cgi/tech/1158991211/156
157: デフォルトの名無しさん [sage] 2006/10/21(土) 00:43:07 >>155 意味不明 http://echo.5ch.net/test/read.cgi/tech/1158991211/157
158: デフォルトの名無しさん [sage] 2006/10/21(土) 00:43:28 >>154 vectorが確保するメモリを要素数ぴったりに合わせるテクニックで x.swap(std::vector<T>(x)); ってのがあったと思うけど、これもダメなの? http://echo.5ch.net/test/read.cgi/tech/1158991211/158
159: デフォルトの名無しさん [sage] 2006/10/21(土) 00:46:06 一時オブジェクトをswapの引数にするのは何も問題ない(ちゃんとしたコンパイラなら) http://echo.5ch.net/test/read.cgi/tech/1158991211/159
160: デフォルトの名無しさん [sage] 2006/10/21(土) 00:50:03 constでない参照引数に一時オブジェクトはダメじゃなかったっけ? http://echo.5ch.net/test/read.cgi/tech/1158991211/160
161: デフォルトの名無しさん [sage] 2006/10/21(土) 01:01:03 >>158 VC++2003で警告レベルを最高にするとwarningになるな。 http://echo.5ch.net/test/read.cgi/tech/1158991211/161
162: デフォルトの名無しさん [sage] 2006/10/21(土) 01:27:59 23.1 Container requirementsによればa.swap(b)とswap(a,b)は同じで、 25.2.2 Swapによれば template<class T> void swap(T& a, T& b); 1 Requires: Type T is Assignable. とあるから、できないんじゃね? と思ってx.swap(std::vector<T>(x));とやったらVC++2005でエラーになった。 と思ったらstd::vector<int>(x).swap(x);は通った。 何じゃこりゃ。 http://echo.5ch.net/test/read.cgi/tech/1158991211/162
163: デフォルトの名無しさん [sage] 2006/10/21(土) 02:05:58 >>158 swap技法はstd::vector<T>(x).swap(x);じゃない? http://echo.5ch.net/test/read.cgi/tech/1158991211/163
164: デフォルトの名無しさん [sage] 2006/10/21(土) 07:43:54 >>162 template<class T> void swap(T& a, T& b); はaもbも非const参照だから、一時オブジェクトを受け付けない。 std::vector<int>(x).swap(x);は、 std::vector<int>(x)が一時オブジェクトだが非constなので、非constなメンバ関数を呼べてしまう。 http://echo.5ch.net/test/read.cgi/tech/1158991211/164
165: デフォルトの名無しさん [sage] 2006/10/21(土) 08:54:42 >>158 お前何にもわかってないのな >>159 馬鹿確定 http://echo.5ch.net/test/read.cgi/tech/1158991211/165
166: デフォルトの名無しさん [sage] 2006/10/21(土) 10:01:26 あ、一時オブジェクトに対して非constメンバを呼ぶのはいいのか。 http://echo.5ch.net/test/read.cgi/tech/1158991211/166
167: デフォルトの名無しさん [haskell厨] 2006/10/21(土) 21:13:06 int add(int a,int b){return a+b;} があるとして、 boost::function<int (int,int)> f = add; はコンパイルできるわけですが、 boost::function<boost::function<int,int> (int)> g = add; のようなことがしたい場合はどうし たらよいでしょうか?addを、int->int->int ではなく int-> (int->int) として扱いたいというか。 gに、あとで(addの)第一引数を渡して、boost::function<int,int>型の関数オブジェクトを得て、 更にその後で(addの
)第二引数を渡し、最終結果を得たいという感じです。 http://echo.5ch.net/test/read.cgi/tech/1158991211/167
168: 167 [sage] 2006/10/21(土) 21:20:16 fをgに変換する方法でも結構です。 よろしくおながいします http://echo.5ch.net/test/read.cgi/tech/1158991211/168
169: デフォルトの名無しさん [sage] 2006/10/21(土) 21:44:22 >>167 どうしてもその変換をしないと駄目? 第一引数が既にあるならそれを部分適用することは簡単なんだが。 http://echo.5ch.net/test/read.cgi/tech/1158991211/169
170: デフォルトの名無しさん [sage] 2006/10/21(土) 22:05:03 思った程大変じゃなかった。 # include <boost/function.hpp> # include <boost/lambda/lambda.hpp> # include <boost/lambda/bind.hpp> # include <iostream> # include <functional> namespace lam = boost::lambda; int main(void) { typedef boost::function<int (int, int)> f_type; f_type f = std::plus<int>(); boost::function<boost::function<int (int)> (int) > g = lam::bin
d(std::bind1st<f_type, int>, f, lam::_1); std::cout << g(7)(2) << '\n'; } http://echo.5ch.net/test/read.cgi/tech/1158991211/170
171: 167 [sage] 2006/10/21(土) 22:05:15 >>169 第一引数の部分適用が簡単なのは承知しているのですが…変換希望です。 http://echo.5ch.net/test/read.cgi/tech/1158991211/171
172: 167 [sage] 2006/10/21(土) 22:23:29 >170 ありがとうございます。やってみます。 http://echo.5ch.net/test/read.cgi/tech/1158991211/172
173: デフォルトの名無しさん [sage] 2006/10/21(土) 23:04:05 boost::bindでもいけるね http://echo.5ch.net/test/read.cgi/tech/1158991211/173
174: デフォルトの名無しさん [sage] 2006/10/21(土) 23:10:30 >>173 いってみてよ http://echo.5ch.net/test/read.cgi/tech/1158991211/174
175: デフォルトの名無しさん [] 2006/10/22(日) 01:05:59 template <typename A, typename B, typename C> int foo(A a, B b, C c) { return 0; } template <typename A, typename B> int foo(A a, B b) { return 0; } に対して、後者の関数をbindするつもりで boost::bind(foo<int,int>, _1, 100); すると、no matching function for call to ‘bind(<unresolved overloaded function type>, boost::arg<1>&, int)’ とか言われてしまうんだが、これって回避策ありますか? gcc4.1です http://echo.5ch.net/test/r
ead.cgi/tech/1158991211/175
176: デフォルトの名無しさん [sage] 2006/10/22(日) 01:12:24 >>175 boost::bind(static_cast<int (*)(int, int)>(foo), _1, 100) http://echo.5ch.net/test/read.cgi/tech/1158991211/176
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 825 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s