[表示 : 全て 最新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/

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

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

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

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

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

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

106 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 22:40:20 ]
s.reset(new string("foo"));

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

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




110 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 01:03:57 ]
見直した方がいいかもね。結果は変わらないかもしれんが。

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

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

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

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

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

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

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


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

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

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

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

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





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

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

122 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 13:51:45 ]
>>123
それは例外ではないから例外で抜けるのは不適当だろう。


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

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

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


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

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

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



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

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

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


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

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

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

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

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

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

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

139 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:24:13 ]
つ boost.function

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

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

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






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

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




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

147 名前:141 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:02:38 ]
>>143
速度が必要なら仮想関数や関数ポインタは向かないね。
テンプレートで展開されるようにしたほうがいいかも

149 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [2009/02/23(月) 00:15:36 ]
>>149
うおっ!なんかすごいのきたw
テンプレートの引数にvoid (T::* func)()なんて使えるのかー。
カルチャーショックだぜ。
もっと精進せねば。

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


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

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

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

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


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

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

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

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

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> {};







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

前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