5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Boost総合スレ part7

1 :デフォルトの名無しさん:2009/01/19(月) 21:22:22
過去スレ
part 6 http://pc11.2ch.net/test/read.cgi/tech/1207749841/
part 5 http://pc11.2ch.net/test/read.cgi/tech/1192662575/
part 4 http://pc11.2ch.net/test/read.cgi/tech/1175663346/
part 3 http://pc11.2ch.net/test/read.cgi/tech/1158991211/
part 2 http://pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 http://pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■
Boost C++ Libraries
http://www.boost.org/

Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/

Let's Boost
http://www.kmonos.net/alang/boost/

boost info
http://shinh.skr.jp/boost/

2 :デフォルトの名無しさん:2009/01/19(月) 21:28:03
>>1



3 :デフォルトの名無しさん:2009/01/19(月) 21:31:09

こ、これは>>1乙じゃなくて>>2乙なんだからね!

4 :デフォルトの名無しさん:2009/01/19(月) 21:31:40
■関連書籍■
Boost C++をチューンアップする最先端ライブラリ
http://www.amazon.co.jp/exec/obidos/ASIN/4894714191/

Boost C++ Libraryプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4798017043/

Beyond The C++ Standard Library
http://www.amazon.co.jp/exec/obidos/ASIN/0321133544/

C++ Template Metaprogramming
http://www.amazon.co.jp/exec/obidos/ASIN/0321227255/

The Boost Graph Library
http://www.amazon.co.jp/exec/obidos/ASIN/0201729148/

■関連スレ■
C++相談室 part65
http://pc11.2ch.net/test/read.cgi/tech/1230341243/

C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/

【C++】STL(Standard Template Library)相談室 11
http://pc11.2ch.net/test/read.cgi/tech/1231640024/

5 :デフォルトの名無しさん:2009/01/19(月) 21:32:40
Loki
http://sourceforge.net/projects/loki-lib/

JTC1/SC22/WG21 - The C++ Standards Committee
http://www.open-std.org/jtc1/sc22/wg21/

POCO, the C++ Portable Components
http://www.appinf.com/poco/info/
http://sourceforge.net/projects/poco/

The unofficial BCB Boost patches
http://bcbboost.sourceforge.net/

6 :デフォルトの名無しさん:2009/01/19(月) 21:34:00
テンプレは以上です.

>>4
・Boost C++をチューンアップする最先端ライブラリ
を加えたのと,
・Boost C++ Libraryプログラミング
のリンクを第二版に修正しました.

7 :デフォルトの名無しさん:2009/01/20(火) 01:04:16
コンパイラ VC8
boost 1_37_0

次のコードがC2780連発です。

#include <boost/bind.hpp>
#include <boost/numeric/interval.hpp>

using namespace boost;
using namespace boost::numeric;

int main()
{
  bind(&in, 3, interval<int>(2, 4));
}

何か対処法などご存知の方いらっしゃるでしょうか?
find_ifなどの条件式に使いたいのですが。


8 :デフォルトの名無しさん:2009/01/20(火) 02:08:01
>>7
in のテンプレート引数を指定すれば、とりあえずうまくいくと思うけどbind(&in<int, interval<int>::traits_type>, 3, interval<int>(2, 4));
もっと簡単にかけるかどうかはわからんです

9 :デフォルトの名無しさん:2009/01/20(火) 16:07:04
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ  まピョーん☆
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

10 :デフォルトの名無しさん:2009/01/22(木) 02:09:13
OS: Mac OS X 10.5.6
コンパイラ: gcc 4.0.1
boost: 1_37_0

この環境で,filesystemをソースからビルドしてパスを通して,
g++ test.cpp -lboost_filesystem-gcc40-mt-1_37
みたいにコンパイルしようとすると,リンカがsymbol not foundとエラーをはきます.

ubuntuでは問題ないためmac特有の問題だと思うのですが,原因,対策がお分かりの方いらっしゃいませんか?

ちなみに,以下がコンパイル結果です.
g++ test.cpp -lboost_filesystem-gcc40-mt-1_37
Undefined symbols:
"boost::system::get_generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccCDIN5Z.o
(長いので中略)
libboost_filesystem-gcc40-mt-1_37.a(operations.o)
__static_initialization_and_destruction_0(int, int)in libboost_filesystem-gcc40-mt-1_37.a(operations.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

11 :10:2009/01/22(木) 02:20:10
ソースコードは以下の通りです.
#include <boost/filesystem.hpp>

using namespace boost;

int main(int argc, char** argv)
{
filesystem::path dir("test");
filesystem::create_directory(dir);
return 0;
}

12 :デフォルトの名無しさん:2009/01/22(木) 07:21:21
>>8
コンパイルできました。
ありがとう。

13 :デフォルトの名無しさん:2009/01/22(木) 09:19:21
>>10
-lboost_system-mt

14 :10:2009/01/22(木) 16:35:26
>>13
無事コンパイルできました.
冷静に考えてみると,エラーを見たらboost::systemを参照してたんですね...
それにしてもなんでmacだけ挙動が違うんだろうか.
とにかくありがとうございました!!

15 :デフォルトの名無しさん:2009/01/22(木) 17:21:16
ubuntuに入ってるのが1.34.1以前なんじゃね

16 :デフォルトの名無しさん:2009/01/23(金) 18:33:46
更新しました。
ttp://booster.x0.to/

17 :デフォルトの名無しさん:2009/01/23(金) 21:08:29
いったい何人が落としてるのか知らんが
RSS配信でもしてテンプレにURL貼るとかすりゃいいのに
毎度毎度スパムのように貼るな

と言ったら荒れるのだろうか

18 :デフォルトの名無しさん:2009/01/24(土) 08:17:34
>>17
そうカリカリすんな。お前は本物のスパムにもマジレスするのか?
目障りだと感じたなら黙ってあぼーんするだろ?

19 :デフォルトの名無しさん:2009/01/24(土) 12:04:12
もうすぐ1.38ですね。
何が変わったのか楽しみ

20 :デフォルトの名無しさん:2009/01/24(土) 15:45:15
0xまでC++はおあずけ

21 :デフォルトの名無しさん:2009/01/25(日) 11:03:31
0xいらね

22 :デフォルトの名無しさん:2009/01/25(日) 23:18:01
マイクロ秒の値をミリ秒に変換するのにboost::unitsを使うのは重すぎ?
1000で割るだけのことなんだけど、1000倍する人がいたりするので、
こういう仕組みを導入する必要もあるかもしれないと思って勉強してるんだが、
思ったより複雑でちょっと挫折しかけてる。

23 :デフォルトの名無しさん:2009/01/26(月) 10:54:49
>1000で割るだけのことなんだけど、1000倍する人がいたりするので、
>こういう仕組みを導入する必要もあるかもしれないと思って勉強してるんだが、
そういう仕組みを導入するより、1000倍して尚且つテストもしてみない阿呆を切るべき。

24 :デフォルトの名無しさん:2009/01/26(月) 11:30:44
boost::functionより速いらしい・・・
http://www.codeproject.com/KB/cpp/fastdelegate2.aspx

25 :デフォルトの名無しさん:2009/01/26(月) 18:14:43
>>24
実装は面白いけれどさ。
正直言って速度差は微々たる物だなぁ。
呼び出しにかかる時間は、現実的に問題にならない。
実際のコードでは、桁が何桁も違うくらい遅い処理を、その呼び出された関数の中でするはず。
すると一千万回呼んで500〜1000msぐらいの速度差なんてどうでも良くなってしまう。

劇的に違うのはコピーにかかる時間で、
これはBoost.Functionの実装ではヒープを使っているために目に見える速度差がでるんだろうけど。
一千万回コピーして十秒足らず。

そんなにコピーする?

26 :デフォルトの名無しさん:2009/01/26(月) 18:33:18
それよりコンパイルが早いのがほしいわ

27 :デフォルトの名無しさん:2009/01/26(月) 22:13:44
>>26
激しく同意

28 :デフォルトの名無しさん:2009/01/26(月) 22:15:05
公共の仕事に配属された。

boost禁止だと・・・orz

29 :デフォルトの名無しさん:2009/01/26(月) 22:23:06
コンパイル早くするのはマシン変えるのがいいんじゃね。

30 :デフォルトの名無しさん:2009/01/26(月) 23:13:36
そりゃ、下手すりゃ数十年単位で保守を続けるプログラムに変化の激しいboostは論外だろ。
大人しくC++0xの正式リリースを待て。

31 :デフォルトの名無しさん:2009/01/26(月) 23:47:25
boostのソースもってきて独自実装に入れちゃえよ。

32 :デフォルトの名無しさん:2009/01/27(火) 00:00:44
boostのソースコードを使うことにはライセンス的にまったく問題ないわけだから、
お前の書いたコードして使うってのはだめなの?

33 :デフォルトの名無しさん:2009/01/27(火) 00:43:46
そのBoostのコードだれかメンテできんのか?
あ,本家のコードに追随して更新していけばいいか…

34 :デフォルトの名無しさん:2009/01/27(火) 08:46:32
>>33
俺は自分がメンテできるとこだけ移植してるな

その過程でソースを詳しく見ることになるので
いろいろと勉強になることも多い

35 :デフォルトの名無しさん:2009/01/27(火) 10:45:02
>>33
別に更新し続けなければいけない理由はないだろ。
もし、自分が「更新されたboostに追加された機能」を使いたいなら必要だけど。

36 :デフォルトの名無しさん:2009/01/27(火) 17:11:35
boost.intrusive.listでアロケータを設定したいのですが設定できませんか?
std::allocatorや自作のアロケーターをテンプレートレベルで混在させたいですぅ。

37 :デフォルトの名無しさん:2009/01/27(火) 17:30:30
すみません自己解決しました。

38 :デフォルトの名無しさん:2009/01/28(水) 13:21:57
1.38のリリース準備が完了したみたいですね。

39 :デフォルトの名無しさん:2009/01/29(木) 00:06:48
New Libraries: Flyweight, ScopeExit, Swap. Updated Libraries: Accumulators, Exception, Hash, Multi-index Containers, Proto, Unordered, Xpressive
ttp://beta.boost.org/users/news/version_1_38_0

40 :デフォルトの名無しさん:2009/01/29(木) 00:54:31
>ScopeExit
もう自前でscope_guard書く必要がなくなるんだろうか

41 :デフォルトの名無しさん:2009/01/29(木) 12:04:22
boost::hoge
を文章の中で言うときは
boost.hoge
って書くことになってるの?

42 :デフォルトの名無しさん:2009/01/29(木) 12:43:31
>>41
いいえ

43 :デフォルトの名無しさん:2009/01/30(金) 21:52:32
更新しました。
ttp://booster.x0.to/

迷惑という意見が多い様でしたらサイトを閉じます。

44 :デフォルトの名無しさん:2009/01/30(金) 22:16:05
>>43
稀によく落とすからなくなると寂しい。
とは言え更新箇所わからないし最新版欲しかったら自分からチェック入れるからな。

45 :デフォルトの名無しさん:2009/01/31(土) 01:29:45
>>43
気にせず続けてくれ

46 :デフォルトの名無しさん:2009/01/31(土) 02:04:04
更新の通知の仕方に文句を付けられただけなのに、いきなりサイト閉鎖とは気が早いな。

47 :デフォルトの名無しさん:2009/01/31(土) 07:21:27
あれ!?
>>43
のサイトまじで消えてる!!

48 :デフォルトの名無しさん:2009/01/31(土) 09:18:59
今日は1.38のリリース日だー(・∀・)

49 :デフォルトの名無しさん:2009/01/31(土) 10:40:19
>>47
あるよ。リロードしてごらん

boostの発展のためには、ライブラリを簡単に使えるよに支援してくれるサイトの存在は良いことだと思うよ。



50 :デフォルトの名無しさん:2009/01/31(土) 22:45:18
もうすぐ1.38 wkwkbnbn

51 :デフォルトの名無しさん:2009/02/01(日) 20:12:06
>>43
サイトを閉じることで更新の報告がなくなるのなら、ぜひお願いします。

52 :デフォルトの名無しさん:2009/02/01(日) 20:37:30
スレの保守を兼ねていて悪くないとは思うんだけどな。

53 :デフォルトの名無しさん:2009/02/01(日) 20:48:11
更新報告でスレが埋まる訳でも無し
>>51は個人的に恨みでもあるのか

54 :デフォルトの名無しさん:2009/02/01(日) 21:28:51
>51
むしろお前がなくなればいい

55 :デフォルトの名無しさん:2009/02/01(日) 22:21:23
>>43様の報告レスがあれば保守ageをしなくて済むというメリットが

56 :デフォルトの名無しさん:2009/02/01(日) 22:46:27
では次回から、SVNのコメントから重要そうなものを幾つか抜粋して
書き込み時に添える様に致します。

57 :デフォルトの名無しさん:2009/02/02(月) 13:48:03
あー、それなら更新点報告ということで役にも立つな。

58 :デフォルトの名無しさん:2009/02/02(月) 17:32:05
便利なサイトだった
コメントつけたことはなかった

59 :デフォルトの名無しさん:2009/02/03(火) 10:03:03
1.38がまでリリースされてない件について!!

60 :デフォルトの名無しさん:2009/02/03(火) 10:34:25
beta2出たのが1/30だぜ?

61 :デフォルトの名無しさん:2009/02/03(火) 13:46:37
C++0xが出た後のboostはどうなるんだろうね。
0x拡張分の6割だか7割だかはboost発祥だそうだし、
0xとの重複分を廃止した上で新たなクラスを追加構築していくのかな?

62 :デフォルトの名無しさん:2009/02/03(火) 16:54:35
いやいや、非対応の古い処理系向けに残ってくれないと困る。
今だってTR1が出た後にunorderedとかhashとか追加しているくらいだ。

63 :デフォルトの名無しさん:2009/02/03(火) 17:50:53
C++0xが広く普及するまではlambdaにはboost版はやっぱり必要だもんな。
0xの普及が遅いとboost版から抜けられなくなるかも



64 :デフォルトの名無しさん:2009/02/03(火) 18:08:47
すみません、#ifdefでboostが使えるかどうかの判定ってできますか?

65 :デフォルトの名無しさん:2009/02/03(火) 18:32:57
>>64
ヘッダーが読み込まれていれば頭で何らかのシンボル定義してるだろうから、それで確認?



66 :デフォルトの名無しさん:2009/02/03(火) 18:37:09
>>65
ありがとうございます。やってみます。

67 :デフォルトの名無しさん:2009/02/03(火) 21:07:35
ヘッダーの読み込みが余所で行われている前提ならともかく自分で #include するなら
boost 使えない時にエラーになっちゃうし。
普通そーいうのは configure とかでやる。

68 :デフォルトの名無しさん:2009/02/06(金) 11:40:39
boostの正規表現ライブラリって日本語対応してないんだな。
ショック

69 :デフォルトの名無しさん:2009/02/06(金) 12:29:26
wide char版なら使えるんでは?

70 :デフォルトの名無しさん:2009/02/06(金) 17:22:40
>>68
boost::wregex
boost::u32regex
好きなほう使え

mingwでicuのstatic作るのにmakefileかなり修正させられた。

71 :デフォルトの名無しさん:2009/02/06(金) 18:23:49
boost::regexよりもboost::xpressive(非静的記述でも)のほうが速いって認識であってる?

72 :デフォルトの名無しさん:2009/02/06(金) 19:53:36
UTFにすることで日本語も問題なく使えるんじゃなかったっけ?

73 :デフォルトの名無しさん:2009/02/07(土) 04:48:31
更新しました。
ttp://booster.x0.to/
今回から、前回のビルドからの変更点を記載したchangelog.txtを同梱する様に致しました。
以下その一部
Fix bug in bessel_jn for n == -1.
Add new test case.
Modified : /trunk/boost/math/special_functions/detail/bessel_jn.hpp
Modified : /trunk/libs/math/test/test_bessel_j.cpp
Added missing config.hpp include for the wide characters support configuration macro.
Modified : /trunk/libs/date_time/test/testfrmwk.hpp
Changed to two_bit_color_map by default
Modified : /trunk/boost/graph/dijkstra_shortest_paths.hpp
Default color map to white, and fixed some warnings
Modified : /trunk/boost/graph/two_bit_color_map.hpp
Add missing #include <iostream>.
Modified : /trunk/libs/asio/example/buffers/reference_counted.cpp
Modified : /trunk/libs/asio/example/chat/posix_chat_client.cpp
Modified : /trunk/libs/asio/example/nonblocking/third_party_lib.cpp
Make validation a static member function. Fixes #2673
Modified : /trunk/boost/random/inversive_congruential.hpp
Modified : /trunk/boost/random/linear_feedback_shift.hpp
added missing std::
Modified : /trunk/boost/flyweight/intermodule_holder.hpp
Use a pipe if eventfd is not supported at runtime. Fixes #2683.
Modified : /trunk/boost/asio/detail/eventfd_select_interrupter.hpp
Ensure arguments to windows::overlapped_ptr::complete() are passed through to
the completion handler. Fixes #2614.
Modified : /trunk/boost/asio/detail/win_iocp_overlapped_ptr.hpp
fix wrong include
Modified : /trunk/boost/fusion/include/remove.hpp

74 :デフォルトの名無しさん:2009/02/07(土) 05:47:16
>>71
長い条件以外では大体そんな感じだと思ってる
ttp://www.boost.org/doc/libs/1_37_0/doc/html/xpressive/appendices.html

75 :デフォルトの名無しさん:2009/02/07(土) 11:13:26
>73
毎回そのまま張るとまた論議を呼びそうな気が。
張るんなら↓みたいにまとめた方が見やすいんじゃないだろうか。機械的処理も可能だし。
各ファイルの Added とかは要らないのでは、と思って抜いてみたんだけど Graph とかは厳しいな。

[Math]
  - Fix bug in bessel_jn for n == -1.
  - Add new test case.
[DateTime]
  - Added missing config.hpp include for the wide characters support configuration macro.
[Graph]
  - Changed to two_bit_color_map by default
  - Default color map to white, and fixed some warnings
[Asio]
  - Add missing #include <iostream>.
  - Use a pipe if eventfd is not supported at runtime. Fixes #2683.
  - Ensure arguments to windows::overlapped_ptr::complete() are passed through to the completion handler. Fixes #2614.
[Random]
  - Make validation a static member function. Fixes #2673
[Flyweight]
  - added missing std::
[Fusion]
  - fix wrong include

76 :デフォルトの名無しさん:2009/02/07(土) 11:26:23
現在何がアクティブなのかがわかって便利だね

77 :デフォルトの名無しさん:2009/02/07(土) 15:03:26
>>74
thx
たいていの場合で2倍以上速いんですね

78 :デフォルトの名無しさん:2009/02/08(日) 00:18:47
Boost.Regexオブジェクト構築に毎回コストがかさむのですが、
すべてクラスの変数にするとかしかないのかな。
いっぱい関数有るんでめんどくさいわ・・・


79 :78:2009/02/08(日) 00:36:08
変更が少なくていいので、
とりあえずstatic変数にすることにしました。

80 :デフォルトの名無しさん:2009/02/09(月) 19:50:24
1.38.0きてるお

81 :デフォルトの名無しさん:2009/02/09(月) 22:14:02
spiritのast_treeの質問なんですが、

//型名など一部省略してます
spirit::rule intp, expp;
intp = leaf_node_d[int_p];
expp = int_p >> *(root_node_d[ch_p(L'+')] >> int_p);

上記のようなルールで、スキップパーサにblank_pを指定して
 1 + 2
を構文解析させたとき、スキップ指定しているにもかかわらず、
2つ目の値のツリーの結果に、+から2までの間のスペースが' ''2'といった
感じに含まれてしまうのですが、leaf_node_dはそういう仕様なんでしょうか?
(1つ目の値はスペースは含まれていない)

リーフノードにスペースを含まないようにするには、スキップパーサを指定してても
intp = no_node_d[*blank_p] >> leaf_node_d[int_p];
の様に、ルール側でもスペースを飛ばすしか方法がないのでしょうか?

82 :81:2009/02/09(月) 22:51:59
訂正
expp = intp >> *(root_node_d[ch_p(L'+')] >> intp);

83 :デフォルトの名無しさん:2009/02/13(金) 18:41:55
更新しました。SVNは1.39に移行しました。
ttp://booster.x0.to/
以下更新内容の一部
[Units]
Zeroing in on bug with sun < 5.9
Begin tracing xlc failure
[Graph]
Integrating SOC 2007 code
Importing all_cliques, all_cycles algorithms
Importing geodesic distance module from SOC.
Imported clustering coefficient, eccentricity and core numbers algorithms.
[Regex]
Fixes #2713: change table initialisation so that it's initialised statically.
Workarounds to allow compilation by Sun studio without the -library=stlport4 option.
[Random]
correctly detect the end of the range in lagged_fibonacci_01::seed. Fixes #2703
Split random_test.cpp into multiple files to avoid hitting resource limits.
Correct stringizing
[Spirit]
Bug fix to iterator

亦、2月8日付で1.38の正式版もリリースされました。
ttp://www.boost.org/users/news/version_1_38_0

>>75
有難うございます、改善致しました。

84 :デフォルトの名無しさん:2009/02/13(金) 18:54:59
ttp://booster.x0.to/
を利用してる奴どれくらいいるの?
手あげて



85 :デフォルトの名無しさん:2009/02/13(金) 19:11:38
利用してます bccのバリなりもほしいです

86 :デフォルトの名無しさん:2009/02/13(金) 19:13:19
自鯖なら、ダウンロード数、アクセス数は把握してるんでは?

87 :デフォルトの名無しさん:2009/02/13(金) 19:35:58
age厨は自演で何をしたいんだ?
前スレから延々つきまとってるだろお前。

88 :デフォルトの名無しさん:2009/02/13(金) 23:41:16
>81 の質問はスルーですか?
他所のastのサンプルでほぼ同じようなコード書かれてるけど、
スキップ文字が入るなんて説明ないし自分のミスっぽい気はするんですが。

89 :デフォルトの名無しさん:2009/02/14(土) 10:26:38
少なくても最近ここに訪れている人の中には回答できる人はいないと思う。

90 :デフォルトの名無しさん:2009/02/14(土) 10:40:56
つかえねー

91 :デフォルトの名無しさん:2009/02/14(土) 11:23:14
>>88
> >>81の質問はスルーですか?

お前が答えてやれよ。

92 :デフォルトの名無しさん:2009/02/14(土) 12:57:25
>>81
blank_p ではなく space_p

http://tamachan.club.kyutech.ac.jp/~gridbug/spirit/spirit01.html

93 :デフォルトの名無しさん:2009/02/14(土) 13:02:52
>>92
やっぱ、違うっぽいorz

94 :デフォルトの名無しさん:2009/02/14(土) 15:14:53
>>81
intpいらない。int_pは元々単一ノードとして解析される。
expp = int_p >> *(root_node_d[ch_p(L'+')] >> int_p);
多分、leaf_node_dがint_pの前にスキップされた空白をノードに取り込んでるんだろう。

95 :デフォルトの名無しさん:2009/02/14(土) 16:04:06
>>94
int_pのみだと空白スキップされることはまでは試して
気がついてたのですが、int以外の自作トークンが使いたいときに
どうすれば良いのかで悩んでます。
やはりno_node_dで空白飛ばすのが正答なんでしょうかね。

96 :デフォルトの名無しさん:2009/02/14(土) 17:43:19
>>95
バグかも知れんね。
spirit/tree/common.hppの907行あたりを書き換えたら予想通りの結果になったよ。
if (hit) {
std::advance(from, std::distance(from, scanner.first) - hit.length());
return result_t(hit.length(),
factory_t::create_node(from, scanner.first, true));
}

97 :統合しました。。。::2009/02/14(土) 18:08:11
http://pc11.2ch.net/test/read.cgi/tech/1234420483/

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

98 :デフォルトの名無しさん:2009/02/14(土) 18:08:15
>>96
なるほど、そうでしたか。
チュートリアルなどでもこの不具合の発生するコードがあるのに
今まで誰も問題にしなかったみたいだし、割と最近の修正で
混入したバグなんでしょうね。

わざわざ調べていただいて、ありがとうございました。

99 :89:2009/02/14(土) 22:21:42
>>96
正直侮りすぎた。スマンかった。

100 :デフォルトの名無しさん:2009/02/15(日) 04:17:45
謝らなくていい。ただ邪魔だから消えろ。

101 :デフォルトの名無しさん:2009/02/16(月) 13:09:53
それよりその不具合についてコミットしといたほうがいいんでは

102 :デフォルトの名無しさん:2009/02/16(月) 14:41:28
boostは読めるけど英語は読めません

103 :デフォルトの名無しさん:2009/02/16(月) 18:17:28
>>102
辞書引け

104 :デフォルトの名無しさん:2009/02/16(月) 20:49:17
タイトルをast_tree value bug ? とでもして、
症状の出る最小のコード書いて、tree.value の結果書いて // bug ?
とでも書いとけば多分汲み取ってくれるだろう。

該当フォーラムのアドが分からんので自分はコミットできませんけど。

105 :デフォルトの名無しさん:2009/02/16(月) 21:11:19
this sentence is written in japanese.
あとはローマ字で適当に書いておけ。

106 :デフォルトの名無しさん:2009/02/16(月) 22:34:08
スマートポインタを昨日から触り始めました。
これはokなのに、
boost::scoped_ptr<string> s( new string("foo") );

これはコンパイル出来ない仕組みなのはなぜ?
boost::scoped_ptr<string> s;
s = new string("foo");

たとえばコンストラクタの中でinit関数を呼んで
その中でポインタ初期化したい場合とかどうすればいいんだ

107 :デフォルトの名無しさん:2009/02/16(月) 22:40:20
s.reset(new string("foo"));

108 :デフォルトの名無しさん:2009/02/16(月) 22:40:21
>>106
s.reset(new string("foo"));

109 :デフォルトの名無しさん:2009/02/16(月) 23:18:39
>>106
ひとつのポインタを別々のshared_ptrに代入してはいけないのでポインタを=で代入できないようにしている。newしたらすぐにスマートポインタにセットさせるのが基本。
スマートポインタをスマートポインタに=を使って代入は可能のでこれを使って共有する。


110 :デフォルトの名無しさん:2009/02/17(火) 00:07:42
shared_ptrだと
boost::scoped_ptr<string> x;
boost::scoped_ptr<string> y( new string("foo") );
x = y;

scoped_ptrだと
x.reset(new string("foo"));

と理解しました。
init関数でresetって違和感ありますが、こういうものなのでしょうか。
scoped_ptrを初期化子リストでnewしない場合は
設計を見直した方がいいのかな

111 :デフォルトの名無しさん:2009/02/17(火) 01:03:57
見直した方がいいかもね。結果は変わらないかもしれんが。

112 :デフォルトの名無しさん:2009/02/17(火) 01:12:04
shared_ptrでもresetできるよ、一応念のため。

113 :デフォルトの名無しさん:2009/02/17(火) 03:44:59
>>110
コンストラクタから例外投げないとか言うアホなコーディング規約に縛られてるんでもなければ
初期化リストで new しとけ。

114 :113:2009/02/17(火) 03:46:52
あれ?ごめん。 init() はコンストラクタの中で呼ぶのね。

そうなると初期化リストで new しない理由がわからん。以下 >111 と同文。

115 :デフォルトの名無しさん:2009/02/18(水) 08:31:26
boostのshared_ptrの資料に、無名オブジェクトを使った以下のコードはfunc2が例外を投げるとリークの可能性があると書いてたけどどう?

func(shared_ptr<Hoge>(new Hoge(),func2( ))

newしてfunc2が評価されて例外投げるとshared_ptrにセットされる前の可能性があるかららしいけど、この評価順は規格上未定義だからって普通にあるの?それとも規格上ありうるってこと?


116 :デフォルトの名無しさん:2009/02/18(水) 10:23:47
>>115
Effective C++にも 「やるな」 って書いてなかったっけ?

117 :デフォルトの名無しさん:2009/02/18(水) 11:04:26
>>115
経験談だけど引数の評価順はかなり簡単に変わるから普通にある
評価順に依存してバグが起こるコードだとマジヤバイ
当然コンパイラ次第なのだけど,デバッグ用の最適化なし,と,最適化あり,にするだけで変わったりする
デバッグで問題見つからなくて泣きそうになったことある

118 :デフォルトの名無しさん:2009/02/19(木) 00:53:23
そんなクソコードはマクロでも使わなきゃでてこないんじゃね?

119 :デフォルトの名無しさん:2009/02/19(木) 03:38:54
スマートポインタどうこうは別にして
評価順によるバグなんて本能的に避けるだろ。

たまに、新米プログラマで、変数使わないで長い式をグダグダ一気に書くのが
かっこいいと思ってる奴がいるから困る



120 :デフォルトの名無しさん:2009/02/19(木) 19:09:25
,を越えて評価順が混ざるとは思わなかった。

121 :デフォルトの名無しさん:2009/02/19(木) 19:56:50
>>120
115の例に表れるカンマは関数呼び出しの一部だよ。
順次演算子としてのカンマなら、たしかに評価順序点になるけど。

122 :デフォルトの名無しさん:2009/02/20(金) 21:44:14
更新しました。
ttp://booster.x0.to/
以下更新内容の一部
[Units]
Get rid of duplication between conversion_helper and conversion_factor_helper.
[Graph]
Updating core_numbers from David Gleich.
Importing examples from SOC 2007
[Random]
Change shfit2 to shift2. Add missing namespace scope definitions of shift1 and shift2. Fixes #2764
Convert uniform_01 to the current distribution interface,
dispatching on the first template paramter to retain backwards compatibility. Fixes #599. Fixes #1544. Fixes #2679
[Ptr_container]
fixed bug in ptr_sequence_adapter.hpp, plus removed some warnings in detail/reversible_ptr_container.hpp.
added new overload of new_clone() that allows for null-values.
removed nasty bug in erase()
[Fusion]
use vectorN instead of vector for shorter names
#define to allow testing if unused_type has IO
[Interprocess]
Ticket #2766: error in boost::interprocess::file_lock::swap
[intrusive]
Ticket #2755: compile error in boost_intrusive 1.38.0: a set of classes with protected destructor
[Spirit]
Fix: rename "boost::math" to "boost::spirit::math".
Remove :: from memcpy()
[Serialization]
Correction to extended_type_info implementation

123 :デフォルトの名無しさん:2009/02/21(土) 13:25:35
boost.graphについてですが、
検索を途中でキャンセルするのは例外を使用するしかない?
例:幅優先で検索し、目的のvertexが見つかったらそこで
検索をやめる。

boost.graph自体は基本的な例外安全は確保されているみたい
なので例外の使用自体に問題はないとは思いますが・・・。


124 :デフォルトの名無しさん:2009/02/21(土) 13:51:45
>>123
それは例外ではないから例外で抜けるのは不適当だろう。


125 :123:2009/02/21(土) 14:02:45
全検索関数を途中やめること自体が例外的・・・。
(言葉遊びですな)

126 :デフォルトの名無しさん:2009/02/21(土) 17:06:21
使用するに足る理由があって他の方法より適当だと思えば
例外でも何でも使えばいいと思うよ
例外だからってエラー処理以外に使わざるべしという論理的根拠はない

127 :デフォルトの名無しさん:2009/02/21(土) 17:11:55
エラー処理以外に例外を使って地雷を踏む例は多いんだが、地雷原と知ってもなお進むというなら止めはしない。


128 :デフォルトの名無しさん:2009/02/21(土) 17:14:17
実装できないよりましだな

129 :123:2009/02/21(土) 17:46:38
>>126
>例外だからってエラー処理以外に使わざるべしという論理的根拠はない
同意です。ただ他の方法があるのかという質問です。
例外使えないときもあるし。

>>127
具体的には? 例外安全に関する話題?

130 :デフォルトの名無しさん:2009/02/21(土) 18:05:52
見つからないってのはエラーではないのか?

131 :デフォルトの名無しさん:2009/02/21(土) 19:11:13
例外は単なるステートメントの1つである。

132 :デフォルトの名無しさん:2009/02/21(土) 19:30:14
例外しか方法ないなー
全部黒にしてvisitorの実行を抑制することならできるけど
それでも走査することには変わりねぇしな
つうことは見付かった時点で全部を辿るって前提が満たされなくなるから例外でいいんじゃないと


133 :デフォルトの名無しさん:2009/02/21(土) 23:53:50
別にチョコボの不思議なダンジョンのリサイクルボックスみたいに
n回使ったらバグが発生するとかそういうものでもないんだから、
そこまでして忌避したり意味を考えたりとかしなくていいんじゃなかろうか。

134 :デフォルトの名無しさん:2009/02/22(日) 00:16:53
Let's Boostの人スゲーなアグレシップすぎwwwwwwwwwwwwwwww

135 :デフォルトの名無しさん:2009/02/22(日) 00:51:26
なんか変わってる?

そういや中の人は院卒業したんだっけか。

136 :デフォルトの名無しさん:2009/02/22(日) 08:04:34
>132
>全部黒にしてvisitorの実行を抑制することならできるけど
TerminatorFunc を使うってことでいいですか?

137 :デフォルトの名無しさん:2009/02/22(日) 09:48:29
>>135
名前と写真が出るわ出るわ

138 :デフォルトの名無しさん:2009/02/22(日) 10:27:09
海外では顔出しも本名出しも普通だろ
ガキじゃねーんだからキャーキャー騒ぐなよ

139 :デフォルトの名無しさん:2009/02/22(日) 16:50:27
クラスのメンバ関数をパラメータ的に扱いたいんだけどどうすればいいかな。
こんな感じのことがしたいんだけど。

class A
{
public:
void func_a1();
void func_a2();
};

class B
{
public:
void func_b();
}

template<???>
void call_twice(???)
{
//オブジェクトとメンバ関数を引数にとってメンバ関数を2回呼ぶ
}

int main()
{
A a;
B b;

call_twice(a,func_a1);
call_twice(a,func_a2);
call_twice(b,func_b);
}

140 :デフォルトの名無しさん:2009/02/22(日) 17:24:13
つ boost.function

141 :デフォルトの名無しさん:2009/02/22(日) 17:33:21
単にメンバ関数へのポインタを使えば十分だろう。
Boost的には、bind使えば引数一つにまとまられるよと言うくらい。

142 :デフォルトの名無しさん:2009/02/22(日) 18:17:25
そのレスはほんとうに単純にメンバ関数へのポインタを渡すような誤解を与えるぞ。
メンバ関数へのポインタをどう使うのかを書かないと。
このスレ的には>>140を使うことを前提にしてるんだろうけど。

143 :139:2009/02/22(日) 21:29:21
レスどうもです。
boost.function使ってみました。結構いい感じ。
で、つかぬことをおききしますがboost::functioinを使った場合インライン展開はされるのでしょうか。
速度が必要なもんで気になります。
一応アセンブラをみて見たんですが俺にはよくわからない。(´・ω・`)
関数ポインタならインライン展開されなさそうなきがするんですが。






144 :デフォルトの名無しさん:2009/02/22(日) 21:42:00
されないね。

145 :139:2009/02/22(日) 21:47:28
そですかー(´・ω・`)
ありがとうございます。
boostってテンプレートだけじゃなくて意外と中でマクロも使われてるんですね。
いっそマクロの併用も検討するか…




146 :デフォルトの名無しさん:2009/02/22(日) 21:58:17
ちなみに関数ポインタもあんまインライン展開はされないぞ。

147 :141:2009/02/22(日) 21:59:17
>>142
単にこれでいいだろうというつもりで書いた。やや楽観的期待だが、インライン展開もされるだろう
template<typename T>
void call_twice(T x, void (T::*p)())
{
(x.*p)();
(x.*p)();
}
int main()
{
A a;
B b;
call_twice(a, &A::func_a1);
call_twice(a, &A::func_a2);
call_twice(b, &B::func_b);
}

148 :デフォルトの名無しさん:2009/02/22(日) 22:02:38
>>143
速度が必要なら仮想関数や関数ポインタは向かないね。
テンプレートで展開されるようにしたほうがいいかも

149 :デフォルトの名無しさん:2009/02/22(日) 23:51:22
147くらいのコードだと頭のいいコンパイラはインライン展開しちゃうけど、
たぶん142は何らかのデータ構造にメンバ関数を保存して必要なときに
実行とかいう使い方をするだろうから最終的には間接参照が最低一回
必要になると思う。

とりあえずテンプレート使ってみた版

template <class T, void (T::* func)()>
void call_twice(T t) {
 (t.*func)();
 (t.*func)();
}

int main() {
 A a;
 B b;
 call_twice<A, &A::func_a1>(a);
 call_twice<A, &A::func_a2>(a);
 call_twice<B, &B::func_b>(b);
}

150 :139:2009/02/23(月) 00:15:36
>>149
うおっ!なんかすごいのきたw
テンプレートの引数にvoid (T::* func)()なんて使えるのかー。
カルチャーショックだぜ。
もっと精進せねば。

どうもありがとうございます。


151 :デフォルトの名無しさん:2009/02/23(月) 11:43:44
>>149
この形式だと inline 化されるというのを昔 Cryolite 氏が実験してたな

152 :デフォルトの名無しさん:2009/02/23(月) 12:18:33
テンプレート引数に関数クラスを渡す方法ならかなり自由度が上がるかも

153 :デフォルトの名無しさん:2009/02/23(月) 16:41:31
ひとつ相談なのですが、初期サイズの違う複数のpoolを同時に使うくらいなら
boost::pool<> pool(1) にして
(T*)pool.ordered_malloc(sizeof(T)) でひとつのpoolを共有すべきですか?

154 :デフォルトの名無しさん:2009/02/23(月) 18:32:23
>>153
サイズの種類が限られてるなら同時につかえばいいんじゃないか?


155 :デフォルトの名無しさん:2009/02/23(月) 18:41:34
やったことは無いんだけど、4バイト未満のチャンクって作れるのかな

156 :デフォルトの名無しさん:2009/02/24(火) 09:25:08
>>153
以前ordered_mallocを使ってnew []演算子を作ろうと思って試したことがあるが、
普通のnew[]演算子よりむちゃくちゃ重くなった。
おそらくメモリプールに指定のサイズの領域が空いてるかどうかチェックする処理が重いんだと思うけど…

157 :デフォルトの名無しさん:2009/02/24(火) 09:45:16
常識的に考えて、その方法が速いならnewの実装なんてとっくにそうなってるに決まってるだろ……

158 :デフォルトの名無しさん:2009/02/24(火) 10:43:02
>>154-157
ありがとうございます。参考になりました
今回は型ごとにpoolを作ろうと思います
ordered_mallocが使用される回数を極力抑えられるように書いてみます

159 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/02/24(火) 20:55:08
突然ですが、おまえらに問いたい!
boostのイメージカラーは何色?

162 :デフォルトの名無しさん:2009/02/24(火) 21:01:09
マ板でやれ

163 :デフォルトの名無しさん:2009/02/24(火) 21:03:29
>>161
失せろクズ

164 :デフォルトの名無しさん:2009/02/24(火) 21:48:39
>>161
二度とくんなカスが

165 :デフォルトの名無しさん:2009/02/24(火) 21:49:15
>>161
VIPでやれ

166 :デフォルトの名無しさん:2009/02/24(火) 21:53:55
ここまで俺の自演

167 :デフォルトの名無しさん:2009/02/24(火) 22:12:16
>>159
create_toolの中は?

168 :デフォルトの名無しさん:2009/02/24(火) 22:21:11
>>162〜166
オメーも反応すんなヴォケ
しかも一人で無駄に投稿すんな。

169 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/02/24(火) 23:59:16
159です。

>>170
確かに
void human::use(tool*);
ならそれで通りますね。ありがとうございます。

私の実際のコードでは
void human::use(tool&);
となっていまして、教えて頂いたようにしても同じコンパイルエラーが発生してしまいます。


172 :デフォルトの名無しさん:2009/02/25(水) 07:01:49
>>171
*と&はまったく違う意味だぞ。
そこで一時オブジェクトを作ろうとしてエラーになってるんじゃないのかconst tool&にしてみろ

173 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/02/25(水) 12:25:21
const tool&を使わずに抽象クラスを渡すには、どうにかしてコピー可能にする必要がある。
tool*を使うか、ref(t)で渡す。

177 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/02/25(水) 14:15:02
マニュアル読む限り
boost::ref => boost::lambda::var
は間違ってると思う。

boost::ref は参照型だけど、lambda::var は参照じゃない

180 :179:2009/02/25(水) 14:34:38
>>179
すまん、間違ってた。
やっぱ参照みたい。

181 :デフォルトの名無しさん:2009/02/25(水) 15:05:38
http://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s04.html

182 :デフォルトの名無しさん:2009/02/25(水) 17:31:50
159です。

>>181
そのページは私も読みました。
boost::refはboost::lambda::varに置き換えられると理解しております。

>>178
でしょうね。
しかし、実装上の事情はどうであれ、インタフェースとしては抽象クラスの参照を
bindの引数にすることを可能としていなければいけないように思えます。
何か回避策がlambdaにあるのではと思うのですが直ぐには見つけられませんね。
ご存知の方いないでしょうか?


183 :デフォルトの名無しさん:2009/02/25(水) 17:55:58
la::bind(&human::use, la::var(man), la::var(boost::ref(*t)))();
でどうか?

184 :デフォルトの名無しさん:2009/02/25(水) 17:57:52
>>182
抽象クラスはインスタンス化できない。それをしようとしているからエラーになる。
テンプレートの引数に参照で渡したいときはref( )を使えば参照が渡せる。

185 :デフォルトの名無しさん:2009/02/25(水) 18:05:31
>>182
>>159
>bind(&human::use, man, ref(t))();

boost::bind できるんなら、boost::lambda::bindにこだわる必要ないでしょう

186 :デフォルトの名無しさん:2009/02/25(水) 18:10:46
bindのプレースホルダによる汚染が怖いとかじゃないんでしょうか

187 :デフォルトの名無しさん:2009/02/25(水) 18:25:05
159です。

>>183
目から鱗ですね。
それでいけました。
ありがとうございます。

>>185
boost::bindとboost::lambda::bindの混在は面倒なトラブルが発生することが
あるので避けています。

皆さんありがとうございました。
他にもスマートな方法があればお教え頂きたいと思います。


188 :デフォルトの名無しさん:2009/02/25(水) 18:27:25
>>183

それでいける理由が知りたい

189 :デフォルトの名無しさん:2009/02/25(水) 18:44:07
簡単に言うならreference_wrapperとidentityにより型の解決が遅延されて、
早期の解決によって束縛される値が参照型から値型になってしまうことを防ぐことができるから
かなぁ

190 :デフォルトの名無しさん:2009/02/25(水) 21:07:02
http://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 :デフォルトの名無しさん:2009/02/26(木) 18:09:02
まだtypoがある件

194 :189: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 :デフォルトの名無しさん:2009/02/26(木) 23:28:29



196 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/02/28(土) 01:30:27
>今迄フルビルドに1時間弱掛かっていたのが20分に超高速化されました
マジかよwwwww

198 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/01(日) 10:10:56
C++0xスレで拡張メソッドが話題になったばかりだから覗いてみるといいかな

200 :デフォルトの名無しさん: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:2009/03/02(月) 03:22:29
あ、間違えた
template<typename T>
struct MyPolicy {
MyPolicy& self() { return *(static_cast<T*>(this)); };
void extend_function() {
// ……
};
};


202 :デフォルトの名無しさん:2009/03/02(月) 04:05:44
>>201
selfの戻り値もT&だろ。

203 :デフォルトの名無しさん:2009/03/02(月) 09:50:38
大元のclass MyClassの記述を変更せずに、という(多分)そもそもの目的に外れるのでは。
何か便利な文字列操作メソッドを追加したいとかで使うんだろうけど、
std::string弄るわけにはいかないし。

204 :デフォルトの名無しさん:2009/03/02(月) 13:34:46
思ったんだけどstructとclassの違いって何だろう?

205 :デフォルトの名無しさん:2009/03/02(月) 13:37:18
>>204
継承とメソッドのデフォルトがpublicかprivateかの違いだけ

206 :デフォルトの名無しさん:2009/03/02(月) 13:42:52
Boost.Iterator使ってイテレータ作るときのオブジェクトはstructにしないとコンパイルエラー出るな
デフォルト継承の問題のようだが

207 :デフォルトの名無しさん:2009/03/02(月) 20:36:56
>206
つ friend class boost::iterator_core_access;

208 :デフォルトの名無しさん:2009/03/03(火) 21:25:08
ARM用にクロスコンパイルができない。bjamで正しく設定すればコンパイル通るのか

209 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/06(金) 23:57:23
あのーーー
>>209にうpされてるのVC2005では使えないんですか?

211 :デフォルトの名無しさん:2009/03/07(土) 00:47:58
VC2008SP1でビルドしておりますので、VC2005では恐らく使えないと思います。
次回からその旨分かる様に、ファイル名に"VC2008"を追加致します。

212 :デフォルトの名無しさん:2009/03/07(土) 00:53:37
>>211
そうなんですか、同じコンパイラメーカーのでもバージョン違うと駄目なんですか,orz

213 :デフォルトの名無しさん:2009/03/07(土) 04:54:22
>212
少し古いバージョンで良いならこっから落とせるよ。
2003, 2005, 2008 用をインストール時に選択可能。
ttp://www.boostpro.com/products/free

214 :デフォルトの名無しさん:2009/03/07(土) 09:40:22
コンパイラによって関数の対応状況変わるから調べたほうがいいよ

215 :デフォルトの名無しさん:2009/03/08(日) 14:57:29
最近はヘッダファイルをジャンルごとにディレクトリ切るように移行中なのか。
あとspirit使うとclassicのヘッダファイル使えと警告出るんだけど、classicじゃないspiritの使い方って
どっかに書いてあるんだろうか・・・(公式ドキュメントも前のまんまだった)

216 :デフォルトの名無しさん:2009/03/08(日) 15:05:58
>>215
spiritはV2になるから準備じゃないか?今のマニュアルがclassicに相当するようだ。
俺も最近spirit始めたところで悩んだ。
classicヘッダは名前空間がclassicに変わってるから注意だ

217 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/13(金) 15:59:34
> const uint64_t c1 = UINT64_C(27111902);
> const uint64_t c2 = UINT64_C(3577643008);
じゃ駄目なの?

219 :217:2009/03/13(金) 16:26:19
>>218
そっちのほうが良さそうですね。(そのマクロは初めて知りました)
私の環境では、マクロ __STDC_CONSTANT_MACROS を自分で定義しないとUINT64_Cが使えませんでしたが、
定義するとうまく行きました。後の人の参考までに。

220 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/16(月) 00:17:11
boost1.36.0を使っているのですが、ファイルの絶対パスから相対パスを取得する良い方法は何か無いでしょうか…?

222 :デフォルトの名無しさん:2009/03/16(月) 00:29:11
あれ?relative_path()ってまさにそのためのメソッドじゃなかったっけ?

223 :デフォルトの名無しさん:2009/03/17(火) 17:05:03
ublasにqr分解する関数ないですか?
lu分解はあるようなんですけど

224 :デフォルトの名無しさん:2009/03/17(火) 18:58:20
>>223
「ublas qr分解」で検索すると、boost.ublasで実装した例が見つかるくらいだから、
直接qr分解するような関数はないんじゃね?

225 :デフォルトの名無しさん:2009/03/18(水) 13:45:04
pythonのc apiが変更になるみたいだけど
boost.pythonは対応してくれるんだろうか
特に日本語文字列を渡せるかあたりが変わるとか

226 :デフォルトの名無しさん:2009/03/18(水) 15:24:07
この機会にLuaとかSquirrelとかに移行してみるというのはどうだろう。 いやもちろん用途次第だけど。

227 :デフォルトの名無しさん:2009/03/18(水) 15:46:02
v8でJavaScriptとか・・・
試してみたらかなり楽に使えたんでびっくりした

228 :デフォルトの名無しさん:2009/03/18(水) 17:49:16
>>226
Boost.Luaとか期待しています。

229 :デフォルトの名無しさん:2009/03/18(水) 18:07:26
pythonってライブラリのサポート率が凄く高いんだよね。
だから簡単に他に移行するのは、結構難しいんじゃないかな。


230 :デフォルトの名無しさん:2009/03/19(木) 09:20:09
じゃあ俺はBoost.AngelScriptを期待。

231 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/21(土) 09:12:24
まったくの勘で物をいってすまないが、

BOOST_FOREACH(int const& i,C)

とかでだめかな?


234 :デフォルトの名無しさん:2009/03/21(土) 09:35:01
BOOST_FOREACH(const int& i,C)

BOOST_FOREACH(int const& i,C)
も同じ意味

235 :デフォルトの名無しさん: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
http://d.hatena.ne.jp/electrolysis/20090220/1235059204
ここのUDP通信のソースで質問なんだけど、
send_to()ではIPとポート指定してるのに、
何故recv_from()では必要無いんですか?

boost::asio::ip::udp::socket がIPとかを記録するんじゃないかと思ったんだけど、
リファレンスマニュアル見ても明確に書いてなかった

239 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/03/21(土) 15:58:49
>>238
recv_fromはbindでポートと結びついてるソケットで読み込んでるからでないの?


244 :238:2009/03/21(土) 16:17:09
>>239
UDPでは(?)どのポートに来たメッセージも受信できちゃうってことですか?

>>243
bind()ではポート番号とか渡してないみたい

245 :デフォルトの名無しさん:2009/03/21(土) 18:27:28
>244
send_toの時にバインドされてる

246 :238: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 :デフォルトの名無しさん:2009/03/22(日) 18:57:14
とりあえず解決法だけ
(x)を(boost::cref(x))にする(refでもおk)
gcc-4.4, boost trunkで動作確認できた

249 :デフォルトの名無しさん:2009/03/22(日) 21:42:42
Boostライブラリって同じ機能・もしくはちょっと違う機能のついた別クラスが
多い.
こういうとこ改善しないのかな?

250 :デフォルトの名無しさん:2009/03/22(日) 21:59:52
>>249
具体的にどれのこと?全部挙げなくて良いからさ。

あと、改善しないのか気になるんなら、直接提案してみれば良いよ。

251 :デフォルトの名無しさん:2009/03/22(日) 22:22:20
249じゃないけど、bindとlambda::bindとかtupleとfusionとか
これまで書かれたコードがあるから一本化できないんだろ
どっちかが非推奨になることはあるかもしれんが

boostのライブラリは便利だけど、組み合わせようとするとあれ?ってなる感じがする。
lambdaはresult_ofに対応したんだっけ?

252 :デフォルトの名無しさん: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:2009/03/24(火) 22:59:56
>>233-235
直らなかったので、ソースを調べました。
コンパイラのバージョンチェックがまずかったようです。
boost/foreach.hppの頭のほうの行の
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 810)
を、以下のように変えたらコンパイラが通りました。
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 1100)

とりあえず、これで様子見です。


72 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)