Boostを語れゴラァ part5
■ このスレッドは過去ログ倉庫に格納されています
0001BOOTS
2007/10/18(木) 08:09:35過去スレ
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/
0049デフォルトの名無しさん
2007/11/21(水) 19:50:48強いて挙げるならregexとかxpressiveか
0050デフォルトの名無しさん
2007/11/21(水) 19:52:29要するにscanf()のboost版が欲しいわけだ
一言で言えば、無いよ
005148
2007/11/21(水) 20:07:58xpressive->lexical_cast戦法でいきます
0052デフォルトの名無しさん
2007/11/21(水) 20:10:200053デフォルトの名無しさん
2007/11/21(水) 21:08:07悪かないと思うが。
0054デフォルトの名無しさん
2007/11/21(水) 23:15:23ちょうどいいサンプルもあることだし。
ttp://boost-sandbox.sourceforge.net/libs/xpressive/doc/html/boost_xpressive/user_s_guide/semantic_actions_and_user_defined_assertions.html
005548
2007/11/22(木) 16:09:45こんなのあったのかー すごい・・・
でもasのなかでも呼ばれてるlexical_castが16進数とかを良きに計らってくれなくて俺涙目w
0056デフォルトの名無しさん
2007/11/22(木) 19:04:45spirit と bind に触発されて昔作ったもの。
sprintf や sscanf みたいなことを spirit っぽく静的に記述する。
string strA, strB;
sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" );
sprint( strB, "2 " % (!_0x[6]) % "/" %_s, 10, "aaaa" );
cout << strA << endl; // 1 0xa/aaaa
cout << strB << endl; // 2 0x000a/aaaa
int xA, xB;
string yA, yB;
sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA );
sscan( strB, "2 " % _x % "/" % _s[3], xB, yB );
print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA );
print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB );
// xA = 10
// yA = aaaa
// xB = 10
// yB = aaa
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5317.zip
0057デフォルトの名無しさん
2007/11/22(木) 23:37:260058デフォルトの名無しさん
2007/11/22(木) 23:48:110059デフォルトの名無しさん
2007/11/22(木) 23:49:16でも今の僕にはその技術はありませんでしたというオチ
0060デフォルトの名無しさん
2007/11/23(金) 14:17:00覚えなきゃならないなんて、C++は大変だな。
おまけにXMLやるならXML用のライブラリ、SQLやるならSQL用のライブラリと
キリがない。
C++もういいよ。終了。
0061デフォルトの名無しさん
2007/11/23(金) 14:19:41頭おかしいのかお前。
例えば、何の言語を使えば
MLやるのにXML用のライブラリを覚えなくていいのか
SQLやるのにSQL用のライブラリを覚えなくていいのか言ってみろ。
0062デフォルトの名無しさん
2007/11/23(金) 14:19:580063デフォルトの名無しさん
2007/11/23(金) 14:21:200064デフォルトの名無しさん
2007/11/23(金) 14:23:27俺は見てるから。
0065デフォルトの名無しさん
2007/11/23(金) 14:23:540066デフォルトの名無しさん
2007/11/23(金) 14:25:380067デフォルトの名無しさん
2007/11/23(金) 14:26:080068デフォルトの名無しさん
2007/11/23(金) 14:29:11MFCはライブラリで、CLIは実行環境ジャン。
0069デフォルトの名無しさん
2007/11/23(金) 14:48:170070デフォルトの名無しさん
2007/11/23(金) 14:48:25並外れて悪い頭を持って生まれてきた人には厳しいかもね。
0071デフォルトの名無しさん
2007/11/23(金) 15:17:290072デフォルトの名無しさん
2007/11/23(金) 15:23:360073デフォルトの名無しさん
2007/11/23(金) 15:35:05「あ、ヤバ!」と思った時、どれだけ自然に「さっきから竿を構えていた」かのように振る舞えるかがコツ
0074デフォルトの名無しさん
2007/11/24(土) 03:07:55後から釣りでしたって言った奴の負けだと思いますぅ〜♪
0075デフォルトの名無しさん
2007/11/24(土) 04:46:35わざわざ同じレベルに堕ちる必要はあるまいて
0076デフォルトの名無しさん
2007/11/24(土) 15:52:12おまえもな
0077デフォルトの名無しさん
2007/11/25(日) 17:16:34unit nYakuso = 7; //薬草1個の値段
unit nFukuro[10]; //持ち物を入れる袋
wstring strIppai(L"持ち物が\nいっぱいです><") ;
という文字列を以下のように変換するプログラムを30秒以内で記述できるか?
unit、nYakuso、=、7、;、unit、nFukuro、[、10、]、;、wstring、strIppai、
(、L、"、持ち物が\nいっぱいです><、"、)、;
0078デフォルトの名無しさん
2007/11/25(日) 17:39:140079デフォルトの名無しさん
2007/11/25(日) 17:43:330080デフォルトの名無しさん
2007/11/25(日) 17:55:10//以下の文字列を無視するのと
クォーテーション文字で囲まれた文字列内で
エスケープ文字を無視するのは標準Boostでは無理。
0081デフォルトの名無しさん
2007/11/25(日) 18:02:1030秒以内は無理そうだが
xpressiveは知らない
0082デフォルトの名無しさん
2007/11/25(日) 18:26:590083デフォルトの名無しさん
2007/11/25(日) 19:04:27だな
0084デフォルトの名無しさん
2007/11/26(月) 05:43:590085デフォルトの名無しさん
2007/11/26(月) 14:51:55swigの方がいいと思った
swigと比べたboost.pythonの利点って何?
0086デフォルトの名無しさん
2007/11/26(月) 17:25:040087デフォルトの名無しさん
2007/11/26(月) 18:27:45double x = 25;
cout << bind(sqrt, _1)(x) << endl;
このコードは、VC++2005では実行できるのですが、
g++ 4.0.0 (boost 1.34) だと以下のように明示的に
キャストしないとコンパイルできません。
cout << bind(static_cast<double (*)double>(sqrt), _1)(x) << endl;
これはg++用boostライブラリ固有の制限なんでしょうか?
0088デフォルトの名無しさん
2007/11/26(月) 18:44:44bindがオーバーロード解決に失敗するときは戻り値の型をテンプレート引数で明示的に指定してやればいいらしいです
0089デフォルトの名無しさん
2007/11/26(月) 18:48:020090デフォルトの名無しさん
2007/11/26(月) 18:49:07もしかしたら、VCにはcmathのfloat版関数の宣言がないのではないか?
0091デフォルトの名無しさん
2007/11/26(月) 19:30:10>>89
>>90
レスありがとうございます。
やはり複数の関数定義があるからなんでしょうかね。
実行はできるので、実装を受け入れることにします。
0092デフォルトの名無しさん
2007/11/26(月) 22:39:40template<typename _Tp> inline _Tp mysqrt(_Tp __x) { return sqrt(__x); }
なら、
cout << bind(mysqrt<double>, _1)(x) << endl;
できるけど。doubleで特殊化されてようとされてなかろうと。
0093デフォルトの名無しさん
2007/11/27(火) 01:46:48指定してるわけだからdouble sqrt(double)を特定できる
はずなんですけどね。コンパイルエラーにもambiguousとは出ていない
ようですし。
0094デフォルトの名無しさん
2007/11/28(水) 23:07:10double を指定しているのは戻り値の型であって、sqrt() の引数の型には寄与してないから特定できないんじゃない?
x の型は bind の解釈には無関係だよね?
0095デフォルトの名無しさん
2007/11/29(木) 00:58:51_1 は確か引数じゃないかな?戻り値ではないと思ったけど。
0096デフォルトの名無しさん
2007/11/29(木) 03:42:26using namespace boost::xpressive;
sregex tok =
as_xpr("hoge") >> (("!">>~before(eos)) | ("!!">>~before(eos)) | eos);
smatch m;
const std::string addr("hoge!hoge!!hoge!");
std::string::const_iterator it = addr.begin(), end = addr.end();
for( ; regex_search(it, end, m, tok, regex_constants::match_continuous)
; it = m[0].second )
{
std::cout << m[0] << std::endl;
}
このコードで
hoge!
hoge!!
hoge!
と出力されると思ったのですが
hoge!
hoge!
で終わってしまいます
009796
2007/11/29(木) 03:46:41検証に使った文字列は
const std::string addr("hoge!hoge!!hoge");
です
0098デフォルトの名無しさん
2007/11/29(木) 10:35:19as_xpr("hoge") >> (("!!">>~before(eos)) | ("!">>~before(eos)) | eos);
だろ。普通は
0099デフォルトの名無しさん
2007/11/29(木) 12:35:47compose_f_gx_hx とかって Visual C++ 2005 の
STL には入ってないの? ファンクタの合成って
boost::compose か何かが必須?
なんか俺勘違いしてるのかな。
010099
2007/11/29(木) 12:38:120101デフォルトの名無しさん
2007/11/29(木) 12:40:01bind(&f, bind(&g, _1))
な風に
でも>>13のように呼び出し規約が__stdcallの関数については使えないようだ
mlには使えるって書いてあるんだけどねぇ・・・誰か使えた人いないのかなぁ
010299
2007/11/29(木) 12:48:31boost::lambda::bind
#include <boost/bind.hpp>
boost::bind
どちらを使うべきなのでしょうか?
0103デフォルトの名無しさん
2007/11/29(木) 12:53:19__stdcallのものにでも使えるという点でboost::bindかな・・・
010499
2007/11/29(木) 12:56:54ところで、ファンクタの合成って標準のSTLには入ってないよね?
SGIのだけに入ってるとか、そういうことあるのかな?
少なくとも Visual C++ だと compose_f_gx_hx などはありませんでした。
boost::bind のほうがもっと柔軟だから compose_f_gx_hx いらないけど。
0105デフォルトの名無しさん
2007/11/29(木) 22:56:21標準化される前の SGI STL には compose1, compose2 があった。っていうか今もある。
現行の標準規格には入っていない。
compose_f_gx_hx は Boost.Compose での名前。
C++0x では Bind が標準に入るので今後は bind 使えになると思われ。
0106デフォルトの名無しさん
2007/11/30(金) 02:01:44http://www.aristeia.com/EC3E/TR1_info_frames.html
266 tr1::bind Function Object Binders n1455
010799
2007/11/30(金) 15:00:08boost::bind も併用しているんだけど、
そうすると ambiguous って言われる?
0108デフォルトの名無しさん
2007/11/30(金) 15:12:46010999
2007/11/30(金) 15:15:54無名名前空間の下に見えてる _1 はどっから来たものか・・・
#include <boost/bind.hpp> だろうなぁ。
::_1 って指定してやらないとダメみたい。
0110デフォルトの名無しさん
2007/12/02(日) 18:50:17果敢に IntelliSense が攻めてくれるね.
だけどまた boost をリビルドしなきゃならんのか…
今からやろうと思うんだけど, svn trunk から
とってきたのを直接ビルドしてみようと思う.無謀?
0111110
2007/12/02(日) 18:58:00#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1500)
# define BOOST_LIB_TOOLSET "vc90"
ってことは,すでに trunk では対応しているのか.
退行テストも通ってるのかな.しかし svn から export
して持ってきたものをどうやってビルドするのかわからん・・
0112110
2007/12/02(日) 19:24:56あっさり toolset 名として vc9 が検出されたみたい。
つーか、bjam をビルドしようとして build_dist.bat を
実行したらすでに本体のビルドまで勝手にやってくれているのだが・・・
以前ビルドしたときとは大違いに楽になってる気がする。
0113110のチラシの裏
2007/12/02(日) 19:31:29bjam.exe --build-dir=builddir --toolset=msvc-vc9express stage
やってます。Express Edition は固有の toolset 名を持ってるのか?
もしかして 64 ビット版のライブラリをビルドするか否かを決定してる?
0114110のチラシの裏
2007/12/02(日) 19:37:30使おうと思ったら expat や icu4c も vc9 でビルドしなおさなきゃ
らんのかなぁ。
って、記憶をたどってみると、両ライブラリとも単独で使った
ことがあるんだけど、vc7 と vc8 で同じバイナリをリンクしてた
きがするのだが・・・ boost はなんでリビルドしなきゃならないの?
とはいえ、 vc8 用にビルドした boost を vc9 でビルドしてる
アプリケーションからリンクするとリンカが怒るので仕方ない。
0115110のチラシの裏
2007/12/02(日) 19:59:26failed 2 って出たけど、どこで失敗したのかわからん。
bjam はログを残してくれないのか?
0116デフォルトの名無しさん
2007/12/02(日) 20:10:380117110のチラシの裏
2007/12/02(日) 20:17:39bash ばっかりだからしらんかった。
0118110
2007/12/03(月) 00:12:14libboost_graph-vc-mt-gd-1_35.lib
みたいにライブラリファイルの名前中のツールセット名が
-vc- になるのは、なぜ〜〜〜?
自分で変更するのタルい。
0119デフォルトの名無しさん
2007/12/03(月) 00:34:06まぁperlかPowerShell使えばリネームなんて簡単だろ
0120デフォルトの名無しさん
2007/12/03(月) 00:34:49原因を調べるもの面倒だったからファイル名を一括置換した
なんでそうなるんだろうなあ
0121110
2007/12/03(月) 05:34:34まぁリネーム自体は簡単なんだろうけど,そもそも
ツールセット名ってどっかで正規化されていないのかと.
bjam で指定するツールセット名も msvc だけでも
受け入れられるし, msvc-vc8 や msvc-vc80 なども
変に柔軟に受け入れられるけど,オートリンクでは vc80
とか指定してくるし…
「自分でつけた名前だろ!自分でオートリンクできずにどうするよ!」
って突っ込みを入れたくなった.
0122110
2007/12/03(月) 09:08:54ちゃんと vc80 と vc90 って文字がライブラリのファイル名に含まれます。
msvc / msvc-vc80 / msvc-vc90 も受け入れられるけど、
そうするとライブラリのファイル名におけるツールセットの部分が
vc になってしまってオートリンクなどで都合が悪いです。
0123110自分用メモ
2007/12/03(月) 09:41:13--toolset=msvc-8.0 stage
V:\boost-vc9>bjam --builddir=builddir --build-type=complete
--toolset=msvc-9.0 stage
0124デフォルトの名無しさん
2007/12/05(水) 12:27:20typedef StrongTypedef<int> MyIntType;
みたいに使いたい.自分で勝手に上のような使い方をしてるけど,
標準があるならそちらに従いたい.
あと,BOOST_STRONG_TYPEDEF って totally_ordered しか
持っていないけど,もっと一般に additive とかそういうのを
持っているバージョンもあればいいと思う.
さらに serialization にも対応してたらいいなぁ.
#全部「おまえがやれ,自由に」と言われそうだけど
#標準が決まってるほうが可読性が上がると思う.
0125デフォルトの名無しさん
2007/12/05(水) 14:12:06> もっと一般に additive とかそういうのを
> 持っているバージョンもあればいいと思う.
具体的にはどういう型の時なの? additiveが有効なのは。
この辺は、 class NAME##_archetype { ってマクロでやってるから、
テンプレートに文字列処理がないとテンプレートだけでやるのは厳しいね。
0126デフォルトの名無しさん
2007/12/05(水) 21:17:01warning C4996: 'std::XXX': Function call with parameters that may be unsafeとうるさいので
bjam --toolset=msvc-9.0express "--cxxflags=/wd4996" stage
としてみたのですがガンガンwarning C4996が報告されてしまいます
できればboost/config/user.hppとかをいじくらずbjamのオプションとかで渡したいです
0127デフォルトの名無しさん
2007/12/05(水) 21:20:50わかんなかったら環境変数CLを使えばよいんじゃないかな。
0128126
2007/12/05(水) 21:45:28ありがとうございます
0129デフォルトの名無しさん
2007/12/07(金) 07:57:36safe bool idiom にしようとおもって scoped_ptr を
継承した my_scoped_ptr を作ったら conversion が
ambiguous だって怒られた.
0130デフォルトの名無しさん
2007/12/07(金) 10:07:16B に非侵入型の serialize が定義されている場合には
A の serialize も非侵入型にしなくてはならないのでしょうか?
0131130
2007/12/07(金) 11:04:41boost::serialization 関係でもうひとつですが,
BOOST_STRONG_TYPEDF で定義した型はそのまま
シリアライズできないのでしょうか?
自分で非侵入型の serialize を定義するべきですか?
http://boost.org/libs/serialization/doc/wrappers.html
ここを見ると BOSOT_STRONG_TYPEDEF(T,D) で作った型 D
をシリアライズする際には T に自動的に変換されるので
そのままでいい、ということのようですし、実際
BOOST_STRONG_TYPEDEF マクロの定義を見ても
そこで定義されている構造体には確かに変換が用意されているようなのですが
0132デフォルトの名無しさん
2007/12/08(土) 12:44:00tFoo でなく tWFoo と展開されたのだが・・・
t が他の文字ならおkで、また別のプロジェクトだと tFoo と正しく展開された。
ずっと解決できないので誰かご教授ください m(_ _)m
0133デフォルトの名無しさん
2007/12/08(土) 13:06:20tっていうマクロかtFooっていうマクロが定義されてるとか?
0134デフォルトの名無しさん
2007/12/08(土) 21:19:070135デフォルトの名無しさん
2007/12/08(土) 21:39:510136デフォルトの名無しさん
2007/12/08(土) 21:43:20ありがとう
0137132
2007/12/09(日) 05:28:54左手のトークンの末尾が 't' だと駄目なようです。
BOOST_PP_CAT(Get, Hoge) とか BOOST_PP_CAT(Object, Piyo) とか。
0138デフォルトの名無しさん
2007/12/09(日) 08:20:28それはもしかしてプリプロセッサのバグじゃないか?
使ってるプリプロセッサ何?
0139132
2007/12/09(日) 08:59:35VC++ Express 2005 です。
新規プロジェクト作り直して丸ごと移したら正常にコンパイル出来ました・・・
何か気持ち悪いけど、どこかプロジェクトの設定が壊れてたのだと思います。
お騒がせしました。
0140132
2007/12/09(日) 09:49:060141デフォルトの名無しさん
2007/12/09(日) 10:28:26stdとtr1だけにしとけ
0142デフォルトの名無しさん
2007/12/09(日) 10:37:55VC++7.1 は対応度高かったと思うけど 2005 だともしかして劣化してる?
2008 beta はどうなんだろ。
0143デフォルトの名無しさん
2007/12/09(日) 11:51:470144デフォルトの名無しさん
2007/12/09(日) 12:04:452008はもう正式版出ているw
0145デフォルトの名無しさん
2007/12/09(日) 12:56:18何の問題もないが.
時々 IntelliSense が黙るだけで.
VC9 ではかなり賢くなってる.
それでも boost::bind つかいまくりで
ファンクタ合成しまくりとかで黙ることもある.
0146デフォルトの名無しさん
2007/12/09(日) 14:09:37SP1当てたら大丈夫になったけどさ。
0147デフォルトの名無しさん
2007/12/10(月) 14:24:36delete 以外の解放処理を行わせる方法はありますでしょうか。
extern IMalloc* allocator;
{
boost::shared_ptr<ITEMIDLIST> pidl((ITEMIDLIST*)allocator->Alloc(10));
}
//ここでallocator->Freeを呼ばせたい
0148デフォルトの名無しさん
2007/12/10(月) 14:36:59デリータを指定できるコンストラクタがあるよ。
template <typename U, typename D>
shared_ptr( U* ptr, D deleter);
0149147
2007/12/10(月) 15:08:43解決しますた。
クラス全体のテンプレート引数 (1個しか無い) にしか目がいってなくて、
コンストラクタのところを見てなかったです。orz
■ このスレッドは過去ログ倉庫に格納されています