[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 03/13 15:15 / Filesize : 207 KB / Number-of Response : 692
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Boost総合スレ part7



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/

401 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:11:10 ]
今はshared_ptrの話をしてるんじゃないのか

402 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:40:38 ]
>388
それはshared_ptrのオーナー次第。関数自体はオーナーじゃ無いことに注意する必要がある。
下記はかなり恣意的な例だけど、マルチスレッドプログラムだとすぐ嵌りそうですな。


struct A {
A() : s(new std::string) {};
boost::shared_ptr<string> s;
}

void doom(std::auto_ptr<A> body, boost::shared_ptr<string>& str) {
*str; // boo!!
};

int main() {
std::auto_ptr<A> a(new A);
doom(a, a->s);

}



403 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 01:04:44 ]
>>402
この例が一体何を示しているというのか。

boo!とか書いてるところで何か起きるわけでもなし。

404 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 01:26:28 ]
>>402
それ問題ないです…
マルチスレッドについてはconst参照でなく値渡ししたとしても、
コピー操作がアトミックじゃない以上は嵌る可能性があるよ。

shared_ptrの実装自体がconst参照使ってるわけだし、基本はconst参照でいいと思う。

405 名前:402 mailto:sage [2009/04/23(木) 02:11:38 ]
本当?>404
死んでるshared_ptrの参照剥しをしているんだけど?

まあ、マルチスレッドについてはアトミックなカウンタじゃないと死ぬっつうのは確かですな。
C++0xでマルチスレッド対応するらしいけど……

406 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:14:31 ]
>>405
お前、実行してみろ。本当?じゃねーよ。

407 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:19:37 ]
>>405
doom() を抜けるまでは最初の new A で生成したインスタンスは生きてるように見えるが?

408 名前:402 mailto:sage [2009/04/23(木) 02:53:07 ]
あ、本当だ。ごめん。こうしないと死なないね。
まあ、マルチスレッドでもなきゃやらんだろうけど。

struct A {
A() : s(new std::string) {};
boost::shared_ptr<string> s;
}
void doom(std::auto_ptr<A> body, boost::shared_ptr<string>& str) {
{
std::auto_ptr<A> b(body);
}
*str; // boo!!
};
int main() {
std::auto_ptr<A> a(new A);
doom(a, a->s);
}

409 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:59:58 ]
>>408
なんかもう shared_ptr も何も関係ないな。



410 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 03:06:30 ]
>>408
>>402がまずいコードなのは確かだけど、*strの問題じゃないよ。
bodyが先に生成されればa->sの時点で死ぬ。
strが先に生成されれば問題なし。
そして引数の評価順は不定であり、評価順依存のコードの実行結果は未定義なので、
コード自体が間違っている。

411 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 03:23:24 ]
>>410
a による body の初期化って、順番が不定な「引数の評価」に含まれるの?

5.2.2 Function call の p4 より
> When a function is called, each parameter shall be initialized with its corresponding argument.
同じく p8 より
> All side effects of argument expression evaluations take effect before the function is entered.

とか、読んでみたけどはっきりしない。

412 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 07:40:17 ]
まあとにかく、shared_ptrは何も考えずconst参照にしといて問題ないよ。

413 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 12:36:08 ]
>>411
5.2.2 p4のこれがそうなんじゃないかなあ。
>The initialization and destruction of each parameter occurs within the context of the calling function.

414 名前:382 mailto:sage [2009/04/23(木) 19:20:17 ]
ふーむ。
試しに
void foo(const boost::shared_ptr<MyClass> &p)
{
p->m_func();
}

void foo(boost::shared_ptr<MyClass> p)
{
p->m_func();
}
とだけが異なった2種のソースをg++に渡して-O2でコンパイルさせてみたら、
後者の方が大きかったんだが。

とりあえずこのソースに限り、ファイルサイズはconst参照じゃない方が小さく済むみたい。
実行時間は・・・どうやって調べればいいの?


415 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 20:17:17 ]


416 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 20:29:06 ]
>>414
とりあえずcodepadかどこかにソースうpしてもらえないとなんとも

417 名前:414 mailto:sage [2009/04/23(木) 20:41:45 ]
さすがにエスパー要求しすぎなレスだったね。
すまなかった


C++ code - 38 lines - codepad
ttp://codepad.org/xAdtSWJO
コピーバージョン。

C++ code - 38 lines - codepad
ttp://codepad.org/nNuvdFvf
const参照バージョン


このソースをg++に渡してコンパイラオプション-O2で
コンパイルさせてみたら、後者の方が大きかった。

となると、後者の方が効率が悪いってことかなぁ
→でも効率を論ずるならやっぱり速度を測定しないとなぁ
→速度の実測ってどうすればいいのか分からない

ってことです。m(_ _)m

418 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 21:45:07 ]
それくらい自分で調べろ、っていうか速度気にするレベルじゃなくない?

419 名前:414 mailto:sage [2009/04/23(木) 23:18:17 ]
>>418
それもそうだな。
boostのtimerでも使うか。




420 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 23:28:56 ]
const参照は不完全型が許されるのがいい。

421 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 10:10:05 ]
デフォでconst参照でいいってぐらいconst T&ばっかりになるから困る

422 名前:414 mailto:sage [2009/04/24(金) 14:56:00 ]
報告:
結局const参照verの方が遅かった。
サンプルソースでだけど。

423 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 15:30:22 ]
const& で遅くなることなんてあるんだ

424 名前:414 mailto:sage [2009/04/24(金) 15:53:05 ]
>>423
C++ code - 45 lines - codepad
ttp://codepad.org/NiHfAcx4
これの
void the_function(boost::shared_ptr<MyClass> p)

void the_function(const boost::shared_ptr<MyClass> &p)
にしてみたバージョンとで比較してみて。
俺はconst参照verの方が遅くなったよ。


425 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 16:27:09 ]
$cat foo.cxx
#include <iostream>
#include <boost/progress.hpp>
#include <boost/shared_ptr.hpp>
class MyClass {
public:
  virtual void f(){std::cerr << "MyClass f!" << std::endl;};
  MyClass(){std::cerr << "MyClass Constructor!" << std::endl;};
  virtual ~MyClass(){std::cerr << "MyClass Destructor!" << std::endl;}; };
void the_function(boost::shared_ptr<MyClass> p){ p->f(); }
void the_function_cr(boost::shared_ptr<MyClass> const& p){ p->f(); }
int main(){
  const int M=0xffff, N=0xf;
#define FOO(f) {                    \
    boost::progress_timer t;            \
    boost::shared_ptr<MyClass> po(new MyClass);   \
    for( unsigned long i=0; i<M; ++i )       \
      for( unsigned long j=0; j<N; ++j )     \
        (f)(po);                \
  }
  FOO(the_function);
  FOO(the_function_cr); }

$g++ foo.cxx
$./a.out 2>/dev/null
0.85 s
0.81 s

誤差じゃね?

426 名前:414 mailto:sage [2009/04/24(金) 16:37:53 ]
>>425
おや、俺の環境と逆転した結果か?
うーん、どうなんだろう?

427 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:01:08 ]
>>425
iostreamが重そうだと思ったから、
ダミーの関数呼出(GetCurrentProcess)にしてやってみた。
ただし、N = 0xfffに変更。共に-O2使用。

Cygwin g++ 3.4.4
5.87 s
1.79 s

VC++ 2008 SP1
7.70 s
1.12 s

やっぱり参照カウンタの操作が重いんだと思う。
ちなみに、BOOST_SP_DISABLE_THREADS(参照カウンタの操作にアトミックなやつを使わない)
を指定すると、値渡し版の所要時間が4割くらい減る。

428 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:25:28 ]
値渡しのほうが遅くなるのなら納得

429 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 19:51:49 ]
参照よりもコピーコンストラクタが走るほうが速いというのは
なんだかおかしな気がするわな



430 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:24:06 ]
>>414>>417で言ってることが逆なのはどういうことなんだ?
手元ではコピーコンストラクタのほうが実行コードが大きくなったぞ?

431 名前:414 mailto:sage [2009/04/24(金) 22:30:17 ]
俺は二種類のサンプルソースで試したけど参照渡しの方が大きかった。

・・・もしかして参照渡しになっているところの数によって変化する要因があるとか?
あとは最適化か??

432 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:34:34 ]
>>431
一時オブジェクトが作られてないか?

433 名前:414 mailto:sage [2009/04/24(金) 22:42:48 ]
>>432
ちゃんとconst参照渡しだから大丈夫なはずなんだが。。。
う〜ん?

まあ速度は・・・誤差かもしれない。
相当回数トライして結果をt検定してみないと有意に早いとは証明できない程度。
でもサイズは誤差じゃなくcopy_verの方が小さいです。


434 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:45:23 ]
>>431
つまり、>>414は間違いだったってことでいいの?

435 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:48:23 ]
更新しました。ここ暫くはGraphの更新が多いです。それから、Cmakeでのビルド環境が整備されつつある様です。
ttp://booster.x0.to/
以下更新内容の一部
[Graph]
Applied performance patch from Jongsoo Park.
Importing null (no-op) property map from SOC/2007.
[Math]
Add some macro-expansion-suppression code to test_sign.cpp.
Fix for no long double math functions.
[Smart_ptr]
Bring back "explicit" on the auto_ptr rvalue constructor. Refs #2951.

436 名前:414 mailto:sage [2009/04/24(金) 22:49:09 ]
>>434
いや、const参照渡し版よりcopy版の方がこちらの環境ではわずかながら早い。
ただそれが有意な差であると言い切れるかは検定してない。

あと、コンパイラのバージョンがg++ 3.4.5(MinGW)であることを追記し忘れたm(_ _)m

>とりあえずこのソースに限り、ファイルサイズはconst参照じゃない方が小さく済むみたい
これは確か。


437 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:49:25 ]
[Asio]
Don't include termios.h unless BOOST_ASIO_HAS_SERIAL_PORT is defined.
[Property_map]
Approximated non-ASCII character by ASCII one
[Pending]
Fixed tab
[Signals2]
Fix c++0x perfect forwarding for deconstruct.
[Functional]
Fix float support on vxWorks.
[Connfig]
Added support for vxworks.hpp.
Fixes #2959.
[Fsion]
Trying to fix ambiguities of operator<<() for unused_type.
[Regex]
Added possessive modifiers ++ *+ ?+ {}+.
Added support for \v and \h as character classes as per Perl-5.10.
[Serialization]
Add missing 'inline'. Don't include <exception> when excepetions are disabled.

438 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:53:49 ]
>>436
いや、だからさあ、
>>414>>417であなたが言ってることは逆でしょう?
どこかでファイルを取り違えていたりしない?


439 名前:414 mailto:sage [2009/04/24(金) 22:57:07 ]
>>438
ごめん
既に>>414の段階でおかしかった。

吊ってくる。


>つまり、>>414は間違いだったってことでいいの?
おっしゃるとおり逆だ。

>とりあえずこのソースに限り、ファイルサイズはconst参照じゃない方が小さく済むみたい
これは正しい。

そして>>435様に挟む形でレスして申し訳ございません。




440 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 22:59:44 ]
>>414
gccのバージョンと環境を教えて。

441 名前:414 mailto:sage [2009/04/24(金) 23:01:51 ]
>>440
Windows XP Home Edition SP2

C:\>g++ --version
g++ (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

BoostはRelease 1.37.0



442 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 23:05:51 ]
またずいぶんと古いバージョン使ってるなぁ。
うちの会社は未だに2.9系使ってるけど。

443 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 23:07:49 ]
>>442
MinGWが未だ3.4.5しか対応してくれていないんだ。
正式版じゃなければ4.x.x系列のもあるらしいんだが。。。


444 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 23:20:21 ]
まあまあ、Cygwinだって基本は3.4.4ですよ。別途g++-4とかが入れられるけど。

445 名前:443 mailto:sage [2009/04/24(金) 23:27:12 ]
>>444
ああ、やっぱそうなのか。
じゃあ不満持ってもしかたないか。

446 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 23:55:50 ]
MinGWでいつもGCC4.xを自分でビルドして使ってる

447 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 13:59:35 ]
mingwはlibiconvをインクルードしなくなったのと
3.4.5でwstringが未対応なので、野良の4.3.3使ってる。
まあ普通に動くよ。Dwarf2でVC近い速度が出るし。

448 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 03:00:54 ]
Windows 7 64bit でboost群使える?
色々テストしてみたいんだけど

449 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 03:36:54 ]
コンパイラさえ動けば問題ないだろ。



450 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 16:43:09 ]
今までhoge.cppファイルの中でboost::bindを使っていたのだけれど、
今度そのhoge.cppにboost::lambdaも使うことにしようと思っている。
なお、このhoge.cpp以外でboost::bindおよびboost::lambdaは使用していない。
このような時は
1.boost::lambdaをただ追加する
(=<boost/bind.hpp>と<boost/lambda/lambda.hpp>をインクルードする。)
2.boost::bindを使っている箇所も全てboost::lambdaに置き換える
(=<boost/lambda/lambda.hpp>だけインクルードする。)
このどちらが良いのかい?


451 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 16:59:24 ]
boost::bindはグローバルに_1とか置く割と行儀が悪いライブラリだったりするんで俺なら2を選ぶ

452 名前:450 mailto:sage [2009/04/27(月) 17:05:52 ]
>>451
> boost::bindはグローバルに_1とか置く割と行儀が悪いライブラリだったりするんで俺なら2を選ぶ
そうだったんか。
そういえばboost:lambdaの_1とかとバッティングすることがあると聞いた気がするなぁ。
まあbindは古株だからかな?

453 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 17:46:19 ]
bindのところをlambdaにしたらそれだけでファイルサイズが60kbくらいあがったわ。
・・・でもPC向けだしこのくらいいいかな、利便性を考えれば。

454 名前:デフォルトの名無しさん [2009/04/27(月) 23:09:28 ]
初心者ですがお願いします.以下のようなエラーが出て困っています。
boostのbind.hでerror C2825: 'F': '::' が後に続くときは、クラスまたは名前空間でなければなりません
c:\includefiles\boost\bind.hppと出ます。
いかがその部分です

template<class F> struct result_traits<unspecified, F>
{
typedef typename F::result_type type;
};


色々サイトで調べてみたのですが、#include <boost/bind.h>の前に
#define BOOST_BIND_ENABLE_STDCALL
#define BOOST_MEM_FN_ENABLE_STDCALLを書くと良いと記載されていたのですが、
エラーが取れません。原因がわかりませんでしょうか?


455 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 23:27:35 ]
>>454
result_traitsの後に<は書けなくね?

456 名前:デフォルトの名無しさん [2009/04/27(月) 23:50:15 ]
>>455さん
ご返事ありがとうございます。

エラーの箇所を確認したのですが、bind.hの中からエラーを出力しているようです。
boostの中のバグということでしょうか?

457 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 00:10:18 ]
>>456

エラーの発生する自分で書いた側のコードをupして。


458 名前:デフォルトの名無しさん [2009/04/28(火) 00:38:20 ]
>>457さん

確認したのですが bind.hppのエラーしか出力されていないようです。
ちなみにエラー箇所はbind.hppの68行目で

template<class F> struct result_traits<unspecified, F>
{
typedef typename F::result_type type;
};
から出力されておりエラー内容は
error C2825: 'F': '::' が後に続くときは、クラスまたは名前空間でなければなりません c:\includefiles\boost\bind.hpp
error C2039: 'result_type' : '`global namespace'' のメンバではありません。c:\includefiles\boost\bind.hpp
error C2146: 構文エラー : ';' が、識別子 'type' の前に必要です。c:\includefiles\boost\bind.hpp
error C2208: 'boost::_bi::type' : メンバのない列挙型、構造体、共用体が定義されました。c:\includefiles\boost\bind.hpp
error C1903: 直前のエラーを修復できません。コンパイルを中止します。c:\includefiles\boost\bind.hpp
error C2039: 'result_type' : '`global namespace'' のメンバではありません。c:\includefiles\boost\bind.hpp
error C2208: 'boost::_bi::type' : メンバのない列挙型、構造体、共用体が定義されました。c:\includefiles\boost\bind.hpp
と記述されています。お手数ですがアドバイスお願いいたします。



459 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 00:57:36 ]
>>458
boost::bind()を呼ぶところの第3引数が間違っている可能性が高い。
だから>>457



460 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 00:59:54 ]
>>459
第3は余計だった。なんでこんなこと書いたんだ
とにかく引数の指定を間違えてる

461 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 01:38:35 ]
>>458
最近のVisual C++なら、
「foo.cpp(7) : コンパイルされたクラスの テンプレート のインスタンス化 'HogeHoge' の参照を確認してください」
ってのがエラーメッセージの随所に挟まっている。
(IDEからビルドしているなら、エラー一覧ではなく出力ウィンドウのほうに)
このメッセージだけを見ていくと、その中に必ず自分のソースコードを指しているものがあるはず。

462 名前:デフォルトの名無しさん [2009/04/28(火) 02:01:59 ]
>>459,460,461
返事が遅くなってしまい申し訳ございませんでした。
ご親切なご回答ありがとうございます。

自分のソースを確認した所、
1>c:\includefiles\boost\bind.hpp(67) : error C2825: 'F': '::' が後に続くときは、クラスまたは名前空間でなければなりません
1> c:\includefiles\boost\bind\bind_template.hpp(15) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::_bi::result_traits<R,F>' の参照を確認してください
1> with
1> [
1> R=boost::_bi::unspecified,
1> F=void (__thiscall Servent::* )(const boost::system::error_code &,size_t) throw()
1> ]
1> c:\work_data\gg\src\network\servent.cpp(54) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::_bi::bind_t<R,F,L>' の参照を確認してください
1> with
1> [
1> R=boost::_bi::unspecified,
1> F=void (__thiscall Servent::* )(const boost::system::error_code &,size_t) throw(),
1> L=boost::_bi::list3<boost::_bi::value<Servent *>,boost::arg<1>,boost::arg<2>>
1> ]


463 名前:デフォルトの名無しさん [2009/04/28(火) 02:13:39 ]
すみません、誤って書き込んでしまいました。上記のエラーメッセージが出力されています。
ソースとしては、
typedef typename result_traits<R, F>::type result_type;
boost::bind(&Servent::read, this,boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

あと質問なのですが、boostのバージョンによる不具合の可能性はあるのでしょうか?
現在boostの1.35を使用して実行しております。

度々ご質問して申し訳ございません。


464 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 06:06:36 ]
>>454
> 初心者ですが
これいらない

465 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:21:59 ]
ついにboostもcmakeか


466 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:50:26 ]
>>463
コンパイルしてそのエラーの出る最低限のソースが必要。


467 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 01:27:44 ]
VC++のバージョンは?
7.0以下だと該当コードは利用できず、別のコードに置換されるみたいだけど。

468 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 11:13:14 ]
enable_ifの引数にboost::mplもつかえるんだね。boostってスゲエと思った。


469 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 19:11:05 ]
>>468
ホントすげぇよBoost。
C++が大好きなんだろうなぁと思わせられるよね(笑)
Boost.Lambda(functionも。)やBoost.Spirit、Boost.MPLあたりが変態級の名を冠するにふさわしいか。
利便性で言えばshared_ptrもヤヴァイけど。



470 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 22:49:38 ]
preprocessorを忘れるとはけしからんな。

471 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 23:11:00 ]
C++ code - 32 lines - codepad
codepad.org/6fhFzzye
このコードにて、エラーになる原因が分かりません。
私の考えでは
boost::lambda::bind(func_i, boost::lambda::protect(boost::lambda::bind(my_name, boost::lambda::_1)))
でconst char* constを受け取りintを返す関数が得られるので、
それをlambda_test_funcの引数として渡せるのではないかと思ったのですが。
どこを修正すればよろしいでしょうか?


472 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 23:17:13 ]
>>471
lambda で生成される関数は、関数オブジェクトの一種。
関数へのポインタは C++ 言語上の「関数」を指すことができるけど、
言語上はクラスオブジェクトとなる関数オブジェクトを指すことはできない。

関数と関数オブジェクトを同等に扱うためのものとして boost::function がある。

- void lambda_test_func(int (*func_ptr)(const char* const char_ptr))
+ void lambda_test_func(boost::function<int (const char*)> f)

473 名前:472 mailto:sage [2009/04/30(木) 23:38:58 ]
>>471
あと、関数合成に boost::lambda::protect 要らない。
www.boost.org/doc/html/lambda/le_in_details.html#id3704796

474 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 02:59:05 ]
UBLas使ってる人に聞きたいんだけど、固有値分解とかはどうやってるの?
検索するとCLapack使ってるのしかでないけど、みんな自前で書いてるの?

475 名前:471 mailto:sage [2009/05/01(金) 05:58:59 ]
>>472
ありがとうございます。
学べました!

476 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 19:03:13 ]
更新しました。今週はSpiritに大きな変化がありました。
ttp://booster.x0.to/
以下更新内容の一部
[Mpl]
portability patch for sunpro on little-endian platforms
[Regex]
Added support for \g \K and \R.
[Spirit]
Merging Spirit V2.1
Spirit: Added missing files, deleted old files, cleaned up empty directories
Spirit: Started to add repository of reusable Spirit components, added
repository::karma::confix and some related tests
Spirit: Fixed assertion in multi_pass iterator
[Statechart]
Updated VC project files to 1.39.
Fixed a bug that prevented the use of boost::ref()
with fifo_scheduler<>::create_processor<>, reported by Steve Hawkes.
This should fix the non-standard code used in changeset 52616.
[Signals2]
Trying to fix compile problems on msvc 9 in release mode.
[Serialization]
Correct logic for enabling THROW_EXCEPTION
Add support for std::bitset.hpp


477 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 19:10:05 ]
>>476
ほほうspiritがV2になったのか


478 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 01:00:05 ]
>96 の問題は直ったんだろうか

479 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 22:45:06 ]
>>476
Signals2って何かな?と思って調べたらスレッドセーフのSignalらしい。これは欲しい。




480 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 12:01:48 ]
1.39きたぁぁぁ

481 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 13:32:00 ]
>>480
Boostって結構こまめに更新した方が良いの?
俺のBoostは1.37なんだけど。。。

482 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 13:50:15 ]
>>481
最近一定期間ごとにリリースする方針に変えたらしいね。
更新内容を見て、興味のない更新ばかりだったら放置しても可だと思うけど。

特に最近は後方互換性を平気で破壊するような更新が多いから悩む。
exceptionとかexceptionとかexceptionとか。

483 名前:481 mailto:sage [2009/05/03(日) 13:57:14 ]
>>482
ありがとう。exceptionって使ったこと無いなぁ。便利?

その仕様変更はBoostだから出来ることか。
まあC++に正式に乗っちゃったら迂闊に仕様変更できないから
今のうちに満足行くまで更新して欲しい。

484 名前:481 mailto:sage [2009/05/03(日) 14:01:33 ]
>>482
ホントだ、1.36以降、3ヶ月刻みになっているね。
Version 1.39.0
May 2nd, 2009 12:00 GMT
Version 1.38.0
February 8th, 2009 12:00 GMT
Version 1.37.0
November 3rd, 2008 12:00 GMT
Version 1.36.0
August 14th, 2008 12:00 GMT
Version 1.35.0
March 29th, 2008 12:00 GMT


485 名前:471 mailto:sage [2009/05/03(日) 14:36:17 ]
>>472-473
ご教示の通り
boost::lambda::protectを外した上で boost::function を利用したところ、
問題無くコンパイル通りました。
ありがとうございました。

486 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 17:29:29 ]
>>481
必要に応じてあげていけばいいと思うよ。
でもバージョン上げたら、コンパイルできなくなったりすることがあるから一気にバージョン上げるとつらいかも。


487 名前:471 mailto:sage [2009/05/03(日) 17:55:45 ]
普通の部分では以前ご教示いただけた通りで動きました。
今度はBoost.Spiritのセマンティックアクションにラムダ式を入れる時にまた困っております。

//以下はMyClass.hの中身
class MyClass
{
MyClass();
virtual ~MyClass()=0;
public:
static const int get_10(const char * const);
};
//以下はMyClass.cppの中身
#include "MyClass.h"
const int MyClass::get_10(const char * const)
{return 10;}
//mainは以下です。
C++ code - 112 lines - codepad
codepad.org/K35wYWBz

このソース中の質問箇所というコメントのところ
('/' >> fctr)[
boost::lambda::bind(func_geti_reti,
boost::lambda::bind(MyClass::get_10, boost::lambda::_1)
)
]
が問題点なのですが、

488 名前:471 mailto:sage [2009/05/03(日) 17:58:47 ]
前述のように
@Boost.Spiritのセマンティックアクションに
Aラムダのbindで関数を結合し
BMyClass::get_10の部分ががクラスのstaticメンバ関数である
この@〜Bの時に
x_error.cpp:82: error: invalid initialization of non-const reference of type 'co
nst int (&)(const char*)' from a temporary of type 'const int ()(const char*)'
C:/BoostC++Libraries/boost/lambda/detail/bind_functions.hpp:256: error: in passi
ng argument 1 of `const boost::lambda::lambda_functor<boost::lambda::lambda_func
tor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambd
a::detail::unspecified> >, typename boost::lambda::detail::bind_tuple_mapper<typ
ename boost::lambda::detail::constify_non_funcs<T>::type, const Arg2, boost::tup
les::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuple
s::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples:
:null_type, boost::tuples::null_type>::type> > boost::lambda::bind(const Arg1&,
const Arg2&) [with Arg1 = const int ()(const char*), Arg2 = boost::lambda::place
holder1_type]'
というエラーが出てしまいます。
環境はg++です。

489 名前:471 mailto:sage [2009/05/03(日) 18:03:35 ]
先のソースは
× MyClass::get_10(const char * const)
○ MyClass::get_10(const char * const, const char * const)
× boost::lambda::bind(MyClass::get_10, boost::lambda::_1)
○ boost::lambda::bind(MyClass::get_10, boost::lambda::_1, boost::lambda::_2)
とすべきでした。失礼致しました。
それでもなお
x_error.cpp:81: error: invalid initialization of non-const reference of type 'co
nst int (&)(const char*, const char*)' from a temporary of type 'const int ()(co
nst char*, const char*)'
というエラーが出てしまいます。
非constな参照でテンポラリな何物かを捉えているという旨のようですが、
どうすれば回避できるのか分かりません。
どうかお知恵をお貸しください。




490 名前:471 mailto:sage [2009/05/03(日) 18:31:34 ]
boost::lambda::bind
をboost::bindに書き換えたら問題無く動作しました。
個人的にはboost::bindライブラリとboost::lambdaライブラリを混在させるのは気持ち悪いので
出来ればboost::bindの箇所は無くして全てboost::lambda::bindにしたいのですが、
どうすれば良いでしょうか?

491 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 20:36:47 ]
3行でまとめてくれ

492 名前:471 mailto:sage [2009/05/03(日) 21:01:43 ]
>>491
SpiritのSemantic Actionにlambda::bindで関数を結合して渡すとエラーになりますが、boost::bindならOKです。lambda::bindでも大丈夫にする方法を教えていただけないでしょうか?

493 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 21:17:04 ]
恐縮ですwww
func_geti_retiの引数の&が余分じゃないか?


494 名前:471 mailto:sage [2009/05/03(日) 21:36:52 ]
>>493
int func_geti_reti(const int& num)

int func_geti_reti(const int num)

int func_geti_reti(int num)
にしてみましたが、
error: invalid initialization of non-const reference of type 'const int (&)(const char*)' from a temporary of type 'const int ()(const char*)'
と言われます。
私の見解では
関数の戻り値などのテンポラリオブジェクト(この場合はint)を
constな参照で束縛できるというC++の仕様がありますから、
このあたりが問題な訳ではなさそうだと思っております。


495 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 20:23:45 ]
letsboost::operators
ttp://www.kmonos.net/alang/boost/classes/operators.html
ここで紹介されているoperatorsって、いちいち定義が面倒なのを自動化してくれるらしいから
便利そうだと思っているんだが、使うと遅くなったりするのかい?

496 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:18:04 ]
しない。
ただし、クラス/構造体のサイズを余計に増やしたくなければ、ちょっとだけ特殊な記法が必要。

497 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:52:23 ]
>>496
ほう、そうなんか。そのちょっとだけ特殊な記法とはEBOに関連する?

498 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 00:17:24 ]
en.wikipedia.org/wiki/EBO

499 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 00:21:31 ]
>>498
EBOはEmpty Base Optimizationのつもりで書いた。
みんなに通じる略称かと思っていたが甘かったかな。



500 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 00:33:29 ]
意味は判るがその略称は初めて見たぞ。
ちなみにその直感は超正しい。 俺はDirect3Dを使ったソフトでベクトル型をboost::operatorから継承したせいで
半日謎のバグと戦う羽目になった。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<207KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef