トップページ⇒tech
988コメント299KB

Boostを語れゴラァ part5

■ このスレッドは過去ログ倉庫に格納されています
0001BOOTS2007/10/18(木) 08:09:35
語って.はぁと part boost::mpl::int_<5>

過去スレ
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/
0421デフォルトの名無しさん2008/01/29(火) 20:26:28
ひとつの環境でしか動かないならそもそもBoostイラネ
WindowsならクソみたいなMFC使ってればいいじゃん
0422デフォルトの名無しさん2008/01/29(火) 21:04:43
>>421
誰もWindows限定で話なんてしてないじゃん.
そうじゃなくて,セキュリティ上の考慮
(この場合は衝突がどれくらいの確率で起きるか)
をしたポータブルな実装が必要だって話でしょ?
なんでMFCの話なん過去のスレッドで出すかなぁ.
0423デフォルトの名無しさん2008/01/29(火) 21:13:44
< なんでMFCなんて過去の遺物をBoostスレッドで出すかなぁ.
と補完しました
0424デフォルトの名無しさん2008/01/30(水) 01:41:03
singleton は無事 reject されましたとさ。
0425デフォルトの名無しさん2008/01/30(水) 02:26:55
無事ってひどいなw
0426デフォルトの名無しさん2008/01/31(木) 09:33:42
class Gamma{
public:
typedef Gamma type;
typedef size_t value_type;
const static int value = 1;
const static int value2 = 1;
typedef mpl::integral_c_tag tag;

};

template <class T>
struct RetVal2{
const static int value = T::value2;
};

typedef mpl::list< Gamma, Gamma> LIST;

int main(){
  cout << mpl::accumulate< LIST, mpl::int_<0>, mpl::plus<mpl::_1, mpl::int_< RetVal2<mpl::_2>::value > > >::type::value << endl;
return 0;
}

Gamma::value2の合計を出したいんですが、accumulate中にRetVal2にGamma以外のクラスが入力されているようで
value2がないぞと起こられます(多分mpl_::naというやつだと思いますが)。
value以外の数値を合計する方法を教えてください。
0427デフォルトの名無しさん2008/01/31(木) 10:23:59
>>420
使われてますね,結構いろんな場所で.
たとえば Subversion ではリポジトリの識別に
UUIDが使われています.working copy で
svn info とすれば UUID がわかります.
0428デフォルトの名無しさん2008/02/01(金) 10:56:20
VC++2005です。

class SuperFoo {};
class Foo : public SuperFoo {};
こんな感じのクラスがあって、

void DoSomething(SuperFoo *p);
みたいな関数があったとすると、

DoSomething(new Foo);
のようにできますよね。

void DoSomething2(shared_ptr<SuperFoo> p);
しかしこんな関数だと、

DoSomething(shared_ptr<Foo>(new Foo));
ってやるとエラーになるのでstatic_pointer_castしてやらんといけないのですが、
親クラスのキャストはいちいちやりたくないです。

これってこういうものなのでしょうか?
0429デフォルトの名無しさん2008/02/01(金) 11:12:35
>>428
SuperFoo* と boost::shared_ptr<Foo> は暗黙の変換のない無関係な型でしょ。
DoSomething2(shared_ptr<Foo>(new Foo)); はOK。
0430デフォルトの名無しさん2008/02/01(金) 11:20:35
>>429
最後の1行間違ってました。
DoSomething2(shared_ptr<Foo>(new Foo));でエラーになるということです…。
0431デフォルトの名無しさん2008/02/01(金) 11:31:13
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
class SuperFoo{};
class Foo : public SuperFoo{};
void DoSomething2(shared_ptr<SuperFoo> p){}

int _tmain(int argc, _TCHAR* argv[]){
DoSomething2(shared_ptr<Foo>(new Foo));
return 0;
}

VC++2005だがエラーなんて起こらないぞ
0432デフォルトの名無しさん2008/02/01(金) 11:39:13
>>431
すみません自分が間違ってました。

void DoSomething2(shared_ptr<SuperFoo> p);
ではなくて
void DoSomething2(shared_ptr<SuperFoo> &p);
だったのがまずかったようです。
参照をやめたら通るようになりました。
0433デフォルトの名無しさん2008/02/01(金) 13:15:53
豆知識
非constな参照引数に一時オブジェクトは渡せない
0434デフォルトの名無しさん2008/02/01(金) 13:27:43
さらに豆知識
VisualCに限り可能だったりする
0435デフォルトの名無しさん2008/02/02(土) 23:31:20
もうひとつ豆知識
関数の呼び出し式でスマートポインタを構築すべきでない
DoSomething3(shared_ptr<Foo>(new Foo), bar());
だと引数の評価順序は不定なのでnew Foo→bar()で例外送出→shared_ptr構築されず→メモリリークになる可能性がある
0436デフォルトの名無しさん2008/02/02(土) 23:37:36
そういえばそうだったな
引数の評価順序が不貞とか直感に反するふざけた仕様だよな
0437デフォルトの名無しさん2008/02/03(日) 00:34:33
&& か || をオーバーロードして引数の評価順序をちゃんと常識的な社会の貞操ルールに従えさせるものでもつくりませう
0438デフォルトの名無しさん2008/02/03(日) 02:46:57
コンマ演算子も評価順序決まってるから
それ使うのが一番いいと思うぜ。
0439デフォルトの名無しさん2008/02/03(日) 03:40:58
boost::chastityfunction, func, a, b, c, d, ・・・・・
0440デフォルトの名無しさん2008/02/03(日) 10:30:15
>>435
メイヤーズの受け売りじゃないですか
0441デフォルトの名無しさん2008/02/03(日) 10:31:55
>>433
それ常識じゃないですか
>>434
警告レベル上げると非標準と出せることは
サッターがGotWでも言ってますよ
0442デフォルトの名無しさん2008/02/03(日) 11:06:59
警告は所詮コンパイル通るし
0443デフォルトの名無しさん2008/02/03(日) 14:47:36
VC2005 で STL,Boost をスタティックリンクして .DLL を作ることはできるでしょうか?
0444デフォルトの名無しさん2008/02/03(日) 14:50:24
STL はテンプレートライブラリだからリンクなんて不要
Boost もテンプレートのみの範囲なら同様。
0445デフォルトの名無しさん2008/02/03(日) 14:52:24
boostConって何やるの?
BoostCon Call for Sessionsとかメール流れてるけど
04464432008/02/03(日) 17:26:04
>444
ありがとうございます。
STL は無条件で問題ないんですね。
Boost でライブラリを使ってスタティックリンクをして .DLL は作成可能でしょうか?
0447デフォルトの名無しさん2008/02/03(日) 18:41:08
というかboostのDLL版なんて使うことあるのか?
04484432008/02/03(日) 18:47:55
>>447

Boost をスタティックリンクした 自作DLLを作りたいんですが。。。
0449デフォルトの名無しさん2008/02/03(日) 19:02:18
>447 TestUnitやRegexなど一部で必要。
でもxpressiveみたいな代替案もあるので、普通に使っている限りは要らないと思う。
0450デフォルトの名無しさん2008/02/03(日) 19:28:05
>>449
そういう場合でもWindowsだと普通はスタティックリンク版使うだろうってこと。
その辺の制御するマクロもなんかあった気がするが。
04514432008/02/03(日) 19:34:03
Boost は普段スタティックリンクしています。
.DLL は消していますので。
それをスタティックリンクして、自作のプログラムの .DLL をつくれるのかなぁと思ったもので;;;
1本の .exe が大きくなりすぎて、機能ごとに .DLL にしないと、Debug Build のブラウザ情報の書きだしに
時間が掛かって待ちきれないので;
0452デフォルトの名無しさん2008/02/03(日) 19:51:15
適当なDLLプロジェクト作ってBoost使うコード書いてコンパイルすればわかる事なのに、
なぜ試さないのか。
04534432008/02/03(日) 21:37:15
すみません、先輩方に聞いた方が確かだと思ったので;
実験するだけでも難しかしいなぁと思って;
できるって教えて頂ければ何とか、チャレンジしたいと思います。
0454デフォルトの名無しさん2008/02/03(日) 22:37:46
boost関係ないので初心者質問スレへでも行って下さい。
ここで粘着してもスルーされるだけですよ。
0455デフォルトの名無しさん2008/02/07(木) 15:57:22
std::for_each の第三引数が参照で渡せたらなぁ
と長い間思っていたのですが、 boost::ref というのは
そういうときのためにあるのでしょうか?

内部状態を持ったまま幾つものコンテナをなめまわしたいとき,
pred (←第三引数)を渡すといちいちコピーが発生するより
参照で渡したいなぁと.
0456デフォルトの名無しさん2008/02/07(木) 16:30:28
うん
0457デフォルトの名無しさん2008/02/07(木) 17:19:53
銀なら5枚、金なら1枚 ?
0458デフォルトの名無しさん2008/02/07(木) 17:20:02
まちがえた
0459デフォルトの名無しさん2008/02/07(木) 17:23:08
>>457
サイズによって違うよ、銀は三枚のこともあるよ
0460デフォルトの名無しさん2008/02/07(木) 19:36:06
実際ブーストってどんくらいつかわれてんの?
0461デフォルトの名無しさん2008/02/07(木) 20:20:44
boostのサイトとかにあったような
0462デフォルトの名無しさん2008/02/07(木) 20:28:07
boost内のあっちとこっちで、全然違うだろうな。
0463デフォルトの名無しさん2008/02/07(木) 20:29:49
progress_displayの悪口はそこまでだ

あとspiritも
0464デフォルトの名無しさん2008/02/07(木) 20:37:27
spiritはregexと同じぐらいお世話になってる
0465デフォルトの名無しさん2008/02/07(木) 21:41:42
spirit「あるある」
regex「ねーよ」
0466デフォルトの名無しさん2008/02/07(木) 23:00:03
xpressive「まあまあ」
0467デフォルトの名無しさん2008/02/08(金) 04:16:43
compressed_pair「わたしのためにー けんかはやめてー」
0468デフォルトの名無しさん2008/02/08(金) 13:30:59
boost svn最近更新少ないねー
そろそろC++も終わりと考えていいのかな?
0469デフォルトの名無しさん2008/02/08(金) 14:42:02
発想が飛躍しすぎではないか
0470デフォルトの名無しさん2008/02/08(金) 15:00:31
更新ばっかされる不安定状態は本来よろしくない。
枯れないとC++標準として採用できないではないか。
0471デフォルトの名無しさん2008/02/08(金) 21:55:57
C++0xで一儲けするぜ。
0472デフォルトの名無しさん2008/02/09(土) 14:39:41
headのは1.35だけどバグだらけじゃん
それでも更新が少ないって事はboostの開発者達は皆C++捨てて他の言語にいっちゃったって事じゃないのかなーとか思ったり
0473デフォルトの名無しさん2008/02/09(土) 15:28:19
>472
の割にはレビューはそれなりに継続して行われてる気がするんだが。
0474デフォルトの名無しさん2008/02/09(土) 16:34:47
>>472

更新少ないのかな?
svn見る限りでは2月に入ってリビジョンは64上がってるんだが
0475デフォルトの名無しさん2008/02/09(土) 16:42:45

もしかしてCVSの方を見てるとか?
boostの開発はsubversionに移行しててCVSの方は更新止まってるからね。
0476デフォルトの名無しさん2008/02/09(土) 20:04:20
>>472
boosterの変態的嗜好を満足させる言語がほかにあるとは考えにくいがどうだろう。
0477デフォルトの名無しさん2008/02/10(日) 00:22:55
就活でESに使ったライブラリにboostって書いたんだが聞かれたらどうしよう
0478デフォルトの名無しさん2008/02/10(日) 01:44:11
>>477
boots の間違いでした,って言え
0479デフォルトの名無しさん2008/02/10(日) 08:48:09
つ boost::assert
0480デフォルトの名無しさん2008/02/10(日) 12:00:50
SVNの1.35をVC++ 2008 EEでビルドしても、
Debug版が作られないのですが、こういうものなのでしょうか?
コマンドラインはこうしています。
bjam -sTOOLS=msvc "-sBUILD=<runtime-build>release debug <runtime-link>dynamic <threading>multi" stage
0481デフォルトの名無しさん2008/02/10(日) 12:04:10
435 名前:デフォルトの名無しさん 投稿日:2007/07/17(火) 00:59:05
Linux で以下のように release かつ dynamic のライブラリをビルドしようとすると
debug と static の組み合わせもビルドして大量のライブラリができるけど,どこが
間違っているでしょうか? Boost は 1.34.0 です。

./bjam --toolset=gcc --prefix=/usr/local -sBUILD="release <runtime-link>dynamic" --with-regex install



436 名前:デフォルトの名無しさん 投稿日:2007/07/17(火) 01:26:03
>>435
Boost.BuildがV2になったんで-sBUILD消滅
<hoge>hageをhoge=hageにしてオプションとして渡せばおk
0482デフォルトの名無しさん2008/02/10(日) 12:42:17
自分は Visual C++ 2008 Express Edition でビルドするときは
bjam --builddir=builddir-vc9 --build-type=complete --toolset=msvc-9.0 stage >..\build.log
こんな風にしてます。

http://svn.windy.cx/Building/boost-trunk/
をチェックアウトして vc8.bat か vc9.bat をクリックすれば
ビルドできるようになってます。その後 crop.bat をクリックすれば
静的ライブラリ、動的ライブラリ、ヘッダを3つの*.cabファイルに回収します
外部リポジトリとして boost の trunk を指定しているので
チェックアウトにはめちゃくちゃ時間がかかると思います。

http://svn.windy.cx/index.php?boost
いちおうここにWindows用のバイナリをおいてみました。
04834822008/02/10(日) 12:44:35
ちょっとうそです。vc8 か vc9 をクリックするだけで
3つの *.cab ができます。ICU なしでビルドするように
なってますので、必要なら適当にいじってください。

ためしにやってみたけど ICU 見つけてくれなかった(笑
まじめにやれ>俺
0484デフォルトの名無しさん2008/02/10(日) 22:58:35
散々既出だったんですね、すみません。
DLL版があれば十分なので結局こうしました。
bjam --toolset=msvc-9.0 debug release --runtime-link=shared --
link=shared --threading=multi --without-python stage 2>&1 | tee h:\boost.log
0485デフォルトの名無しさん2008/02/10(日) 23:43:22
みんなboostってどのくらい把握してる?
ソースとか全部追ってるの?
謙遜とかなしに、みんなどれくらいboostを掘り下げてるか教えて欲しい。
0486デフォルトの名無しさん2008/02/10(日) 23:51:31
MPLのソース見ようとして速攻で挫折した
0487デフォルトの名無しさん2008/02/11(月) 00:02:28
リファレンスがないと何も書けない。
さすがにBindとかFunctionとか簡単なラムダ式はそらで書けるけど。
0488デフォルトの名無しさん2008/02/11(月) 00:20:03
Spiritなら何回か世話になったからそこそこ。
Graph勉強しようとしたけどワカンネ
0489デフォルトの名無しさん2008/02/11(月) 00:23:47
shared_ptrだけ世話になってる。あとはmem_fnをたまに。
0490デフォルトの名無しさん2008/02/11(月) 01:16:27
rangeの存在意義がいまいちわからんぽ

イテレータに比べてどんな事がうれしいんだろう

今のところ「イテレータより簡潔に書ける事がある」
位の理解しか出来てないっす
0491デフォルトの名無しさん2008/02/11(月) 03:09:39
STLコンテナじゃないものにも使えるのが好きだな。
組込配列とか、イテレータのpairを即興で作ったりとか。
俺自身はサンプル見ただけだけど、CStringとかそっちもRange化できるし。
0492デフォルトの名無しさん2008/02/11(月) 03:50:10
lexical_castとか小物はよく使う
0493デフォルトの名無しさん2008/02/11(月) 05:21:18
optionalはお気に入り。
0494デフォルトの名無しさん2008/02/11(月) 06:23:57
regex使われてないのかな?意外
0495デフォルトの名無しさん2008/02/11(月) 09:40:33
regex面倒臭い。
xpressive使ってる。
0496デフォルトの名無しさん2008/02/11(月) 12:21:29
xpressiveなんてのが増えてたのか。
regexとモロかぶってるw

しかし、ライブラリのコンパイル不要なのと
static regexが使える意外で、regexと何か
大きな違いがあるのだろうか?
0497デフォルトの名無しさん2008/02/11(月) 12:26:46
速い(静的な意味で)
0498デフォルトの名無しさん2008/02/11(月) 12:28:02
regexと比べて全体的に速い
リンク不要といっても演算子によってフル展開されるから
総コンパイル時間は長くなる
0499デフォルトの名無しさん2008/02/11(月) 15:41:15
>496
再帰処理が可能なのも大きい。
普通の正規表現では対応できない入れ子表現なんかも処理できる。
0500デフォルトの名無しさん2008/02/11(月) 16:50:37
あの、なんでこのコードでboost::algorithm::findと曖昧と言われるんでしょう?
VC++ 9とかg++ 4.1.1にBoost 1.34.1, range_exは1.0 (?)ですけど。

#include <istream>
#include <string>
#include <boost/algorithm/string/find.hpp>
#include <boost/range_ex/algorithm.hpp>

void f(std::istream& is)
{
  using std::string;
  string s;
  getline(is, s);
  string::iterator it = boost::find(s, ':'); //range_exのやつを呼びたい。
}
0501デフォルトの名無しさん2008/02/11(月) 17:01:05
>>497-499
なるほど。staticなら早いだろうなってのは
予想してたけど、表記のネストも可能になるんだ。
0502デフォルトの名無しさん2008/02/12(火) 20:48:21
boost.python
python.numpy
をこれから使いまくろうと思ってる
0503デフォルトの名無しさん2008/02/12(火) 23:42:49
rule hoge ( name ) {
  exe $(name) : ./$(name).cpp ;
  exec $(name)-run : $(name) ;
}
local hogehoge = [ modules.peek : ARGV ] ;
hoge [ MATCH "^--name=(.*)" : $(hogehoge[2]) ] ;

bjam --name="projectname"
で実行時にターゲットを生成するルールhoge
これで使い捨てのコードをeditorのマクロで一発テストできるぞ!!

boost-jamって各種コンパイラ用のプリセットがある点以外はかなり貧弱にみえるけど
そうでもないの?皆使ってる??
05045032008/02/13(水) 00:07:56
ごめん上のコードは忘れて
保存して忘れた頃に晒すとかしないでね


>>500
boost/algorithm/string/find.hpp内でusing boost::algorithm::findしているのが原因
ってのはわかるけど
解決策は「どちらか一方だけを使う」ぐらいしか思いつかない
でもまぁ捨てるとしたらrange_exの方かな…
同じようなものにovenがあるし
05055002008/02/13(水) 02:20:01
うわ本当だ。
boost名前空間へ引きづり出されているとは、知りませんでしたOTL。
問題のところは、std::findへ逃げました。
0506デフォルトの名無しさん2008/02/15(金) 12:35:34
>>503
cmakeとどっちが便利なんだろう
cmakeはドキュメントそろってるけどbjamにはない
0507デフォルトの名無しさん2008/02/15(金) 16:47:32
autotoolsじゃないと使いたくない
0508デフォルトの名無しさん2008/02/15(金) 16:52:47
scons
0509デフォルトの名無しさん2008/02/17(日) 21:20:32
http://www.nazystyle.net/boost/install_and_build.shtml
boost 1.341をダウンロードしてここを参考にしてコンパイルしたけど、
D:\Documents and Settings\habu\デスクトップ\boost_1_34_1\tools\build\v2/kernel/bootstrap.jam:82: in boost-build
IMPORT error: rule "import" unknown in module "modules."
D:\Documents and Settings\habu\デスクトップ\boost_1_34_1\boost-build.jam:9: in module scope
と言うエラーが出て先に進めません。
根本的に何か間違っているのでしょうか?

仕方ないので今は渋々インクルードファイルだけを使っていますが・・・。
0510デフォルトの名無しさん2008/02/17(日) 21:22:54
すいません。環境書き忘れました。
Visual C++6.0でWindows XPで動作させています。
0511デフォルトの名無しさん2008/02/17(日) 21:26:33
vc6だと使えないのが多い罠
0512デフォルトの名無しさん2008/02/17(日) 21:32:59
ユーザ名くらい隠そうよ
0513デフォルトの名無しさん2008/02/17(日) 21:43:10
>512
しまった・・・・まあいいや、本名じゃないし。
0514デフォルトの名無しさん2008/02/18(月) 02:22:56
g++4.1.2 boost1.35.1-5 で boost::algorithm::trim なんだけど

vector<string> vecstr; に適当に値を代入して

trim( vecstr[0] );
だとダメ(trim.hpp:229 で no much function.)で
trim( vecstr.at(0) );
もダメだけど

string tmp =vecstr[0];
trim( tmp );
だと通ってしまう。これらってC++的には同じでないの?
(atは領域外だと例外投げるとかをのぞいて)
05155142008/02/18(月) 02:26:57
すみません。vecstrにconst付けてました。サーセン。
0516デフォルトの名無しさん2008/02/18(月) 08:38:52
>>514
それ以前に、trim(& vecstr[0])じゃないのか?
0517デフォルトの名無しさん2008/02/18(月) 11:33:21
ヘッダファイルに次のように書いて
public:
typedef boost::multi_array<double, 2> MyArray;

ある関数の中で

ある関数(){
int Arraylen

Ararylen=3

MyArray A( boost::extents[4],[Arraylen]);

}

とした場合Aと言う変数がこの関数の中で作られているので
どうグローバル化していいか分かりません。
ちなみに、この例ではArraylenの値がすぐ分かるように
なっていますが、自分のプログラムではこの値はその関数内
でしか分かりません。
0518デフォルトの名無しさん2008/02/18(月) 12:43:19
public:
typedef boost::multi_array<double, 2> ;
MyArray A;


ある関数(){
int Arraylen

Ararylen=3

A( boost::extents[4],[Arraylen]);

}

こうやってもダメでしたね。
0519デフォルトの名無しさん2008/02/18(月) 12:46:13
>518
じゃなくて、こうしたらだめでしたね。
0520デフォルトの名無しさん2008/02/18(月) 12:47:32
>518
間違えました。
typedef boost::multi_array<double, 2> MyArray ;
です。
■ このスレッドは過去ログ倉庫に格納されています