1 :
BOOTS :
2007/10/18(木) 08:09:35
2 :
デフォルトの名無しさん :2007/10/18(木) 08:10:02
3 :
デフォルトの名無しさん :2007/10/18(木) 08:10:07
,、ヽl |l | l| l || l| l | ビ ク ッ ミ お っ 立 も __ノ _,.ヘ _,,... -- ─--「::「 {i:.:.:`'、_/:.:.:.:.:.[/-...,,_ ソ ,' い Ξ っ あ て っ ) /::7ヽ、ヘ,.-ァ'^ヽ∠ヽ,/L__`|:::|/}!.:.:.:.:r7=-:.:.:.:.!7::::::::::::`ヽ. ッ i け ニ 立 ぁ な も !::::!´ア「>'‐''"´ `"'<LL_,'i>:'へ、:.:.:.:.:.:.r/::::::::::::::::::::::':., .|. な Ξ て ん い う /´\「>'" ァ':::::::::::::::\__」}:::::::::::::::::::::::::::::ヽ.! い 三 ち ・ っ 糞 ,' _」ア´ / /! ! /! / ;'::::!:::::::';:::';::::::::ヽ::::::':;::::::::::::::、::::! 子 = ゃ ・ て ス i 'ヽ! / 7, 'イハ /! メ、,!__ハ, 'i::::::ト,::::::!::::i::::i:::::::':;:::::';:::::::::::::::ヽ;| ね 三 ぁ ら 約 レ ', .,' / /!,!-'、:レ' |/ァ' レ ヽ!::!:::! ':;:::|ー!-ハ::::::::i:::::::!::::::::':;:::::::ヽ: = ら め 束 は !/ ;' ,ヘ!i. i,.ハ 、,_ !!::!:;ハ ヽ,jァr-;、!_ハ」:::::;':::::::::::::ヽ,::::::::;ゝ、.,__ ニ め っ っ ・ ノへ,/レヘ, ! ゝ' ....::::::... '  ̄´゚o'レヘjソ :::.. 」_r!`> 7__/:::::i:::::::::::::: 三 ぇ ・ ・ ・ ! ノ; ./7''"/// /// !/. ! '"'",':::::::!::::::i:::::::::::i 変 = ぇ も ・ ・ ノ; / ,' ゝ、 ( ヽ u ( ) ハ !:::::;'::::::::':;::::::!. 態 三 ぇ う ・ あ 〈,へレ'〈ジi/ミ>.、..,,____ ,. イ ( )`ヽ. ̄フ !:::/i_;;::;;_:::::< さ ≡, ぇ 糞 は ぁ i `:、レ'"´ !_r'"レ'/:::::::::>ァ、/|ヘ ヽ,__,..,.-''" ̄`ヽ、_ヽ:::':;! ん Ξ, ぇ .ス ぁ っ ':, `ヽ、 ,r;く:::::::!/::::::::::::/」;' `ヽ. _>'" Yヽ:::::!. ? 彡 ! レ ん っ ヽ、 ,.kヘ_!::::ム:::::::/]/ ,ァ-'‐''"´ ヽ!、_ 〉:.!.
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
?
来たよ!
偽・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
12
13 :
745 :2007/10/27(土) 03:54:01
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#define BOOST_MEM_FN_ENABLE_STDCALL
#define BOOST_BIND_ENABLE_STDCALL
#include <boost/bind.hpp>
struct F
{
int __stdcall f(int) { return 0; }
};
int main(void) {
namespace bll = boost::lambda;
F f;
boost::bind( &F::f, &f, bll::_1 )(1);
// bll::bind<int>( &F::f, &f, bll::_1 )(1); <- error!!
}
__stdcallの関数はboost::lambda::bindでは呼びだせないんでしょうか?
boost.usersで次のような古い記事を見付けたのですが
ttp://tinyurl.com/34cv9e この通りに戻り値を明示的に指定しても無駄なようです
boostにLokiのディスパッチャのような物はありますか?
_」, -─ .:. :. :. :.::::::::::::::::::::::::.:.`ヽ 〈 ,.'"´ ̄  ̄`ヽ、.:::::::.:.:./ V´ .::l:|:. `、ヽミミヽ、 ヾ:./ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / .::l::从ト、 `ヾ_ミミヽ、 ヽ < 君さぁこんなスレッド立てるから l/l.:l.:リ仁リニトト、仁≧ミヽ:::ト、 .:::| | 厨房って言われちゃうんだよ `Y::{fトッソ ``ト。ッソ` 1:l:|::`、:::::! \______________ |.::l´¨ 、 ´ ̄ /::リ::::::::V ヽ:ヽ、 ー , タ::l:;:::::::/ , -‐─‐‐- 、 , -─-、 __ , イ/.::j:|:::/l/ , ィ"´ ‐f ‐ \ /., `トい、_,/^i.:l:|/ .// , -──‐- 、`ヽ\ /.:::/ .:i {{i^Y^YYy'l/ 〈 〃 ,ィ´ .:.:.:.:.::.:::::i::l:.\j ト、 /.:.::::/ .:.::| k1 |:l ,ム;、ハ、 V__/:::l/::::/:/.::::,イ.:::ハ!:l::::::.:V / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ L.::::厂ヽ .:.:::::| / {j! ーイ:介;l/ ,ハ /ハ!::/l:::/:/.::;ィイ/:::ハ:::|:::i.:.::{/ < おまえのことを必要としてる奴なんて {7 / \::::! / jfl |:1j! |:|{ Vi l:1ホ{:::l:i;:ィニー 、//-十1:,'.:.:,リ | いないんだからさっさと回線切って首吊れ // ,.イ:::l/ jf| l;」jl j:」| |::H:| {::l:iイヒリソヽ イヒッソl/, イ/ \_________________ /´ ̄ /::::|:;:;.\ kiL, H fj 〉; |:ト、_,{::ト.、_' ' ' '  ̄ / /i _>ーー- ,.イヽ、::l;;;:;:;:;(:::/タ^Tニム、_ ,';{:/ |:|:::Y´「 ̄`ハ、 `´ , .イ _j/::| /。 ̄`¨`ヽ_ソ `1>‐-ヽ{:::::/><!::::::7 |i::ノ { /.::`K T.::::/ /.:::| ,/。 / 〉ニ三云\:.ヽ<ノ::::::」ヽ. Y ,レ'´.::::::::::.〉ハコ``Y::.ヽ / / /¨´ ̄ ̄`ヽ、三三ミ<::::| | //.:::::::::::::::://´j}ト、 _」::::::|
>>14 boost::type
boost::bool_
boost::int_
boost::integral_c
あたりをどうぞ。これもFAQ気味だな。
18 :
745 :2007/10/27(土) 22:59:46
そういう用途ならboost vaultにdispatcherという名前からしてそのものズバリのがあります これを適当にカスタマイズして使うのがよろしいんじゃないでしょうか?
19 :
14 :2007/10/28(日) 08:11:33
レスありがとうございます。
>>17 すみません説明不足でした。
多重ディスパッチによるマルチメソッドです。(Loki::BasicDispatcherとか)
>>18 boost vaultは初めて知りました。(よくみたらLet's Boostにもリンクはってありますね)
ソース見たところ、Lokiの物よりかなり機能が弱く感じます。
Lokiを使うのがいいのかもしれません。
20 :
デフォルトの名無しさん :2007/10/28(日) 18:48:54
boost/type.hppって何に使うんでしょうか? // Just a simple "type envelope". Useful in various contexts, mostly to work // around some MSVC deficiencies. ファイルには上記のように書いてありますがどういうこと?
template<class T> T f(); を f<int>(); と呼べない場合があるので template<class T> T g(boost::type<T>); を g(boost::type<int>()); と呼ぶ
>>20 ディスパッチのユーティリティとして使うとか。
boost/type_traits/detail/wrap.hpp とかもあるね。
template <class T> struct type {};
template <class T>
struct tester {
template <class U> static char (&test(U*))[1];
template <class U> static char (&test(type<U>*))[2];
template <class U> static char (&test(...))[3];
template <class U> static size_t f1(const U&) {
return sizeof(test<T>(static_cast<U*>(0)));
}
template <class U> static size_t f2(const U&) {
return sizeof(test<T>(static_cast<type<U>*>(0)));
}
};
struct X {};
struct XX : X {};
tester<X>::f1(X()); // => 1
tester<X>::f1(XX()); // => 1
tester<X>::f2(X()); // => 2
tester<X>::f2(XX()); // => 3
struct char_p_less : std::binary_function<const char*, const char*, bool>{ bool operator()(const char* left, const char* right) const{ return std::strcmp(left, right) < 0; } } typedef std::map<const char*, std::string, char_p_less> QueryMap; これをLambdaを使って実現したいんですが、Lambda式で書いた結果は関数オブジェクトの値であって、型ではないので typedef std::map<const char*, std::string, (bind(std::strcmp, _1, _2) < 0) > QueryMap; このようなことが出来ないです。 typedef std::map<const char*, std::string, function2<bool, const char*, const char*> > QueryMap; boost::function2<bool, const char*, const char*> compare = (bind(std::strcmp, _1, _2) < 0); こうしてから使うときに QueryMap foo(compare); するしかないですか?
いいえ、他の方法があります。 template<class T> void use_query_map(const T&){ typedef std::map<const char*, std::string, T> QueryMap; QueryMap foo; // fooを使う } これで、この関数内では使い放題です。
use_query_map(bind(std::strcmp, _1, _2) < 0); を書くのを忘れていました。
boost.testのBOOST_PARAM_TEST_CASEマクロの第一引数に boost::function1のオブジェクトを指定することはできないんでしょうか? >error C2660: 'boost::unit_test::make_test_case' : 関数に 4 個の引数を指定できません。 のような具合にどうにも通らないようです #include <boost/test/unit_test.hpp> #include <boost/test/parameterized_test.hpp> #include <boost/bind.hpp> #include <boost/function.hpp> #include <list> void test_mask (int, int){} struct sub_test_suite : public boost::unit_test::test_suite { sub_test_suite() : test_suite("sub_test_suite") { BOOST_PARAM_TEST_CASE( (boost::function1<void,int>(boost::bind(&test_mask, _1, 0x80))) , params.begin(), params.end()); } private: std::list<int> params; }; using boost::unit_test::test_suite; test_suite* init_unit_test_suite( int, char* [] ) { test_suite* test = BOOST_TEST_SUITE( "Parameterized boost::function based test case" ); // add test cases to test_suite test->add( new sub_test_suite ); return test; }
boost::functionからboost::unit_test::callback1への変換が上手くいかないだけのようなので、 このように直接callback1のテンポラリを作って渡してやれば一応コンパイルはできました boost::functionに対する依存も減りますし、この方法使ってればいいんでしょうかね… #include <boost/test/unit_test.hpp> #include <boost/test/parameterized_test.hpp> #include <boost/bind.hpp> #include <list> // user definition test function void test_mask (int, int) {} // user definition test class std::list<int> params; using boost::unit_test::test_suite; test_suite* init_unit_test_suite(int, char* []) { test_suite* test = BOOST_TEST_SUITE("test"); BOOST_PARAM_TEST_CASE( (boost::unit_test::callback1<int>(boost::bind(&test_mask, _1, 0x80))) , params.begin() , params.end() ); return test; }
VC++7.1でboost1.33.1ですが std::wstring sNumber = L"2007"; unsigned short wValue = boost::lexical_cast<unsigned short>(sNumber); でbad_lexical_castが投げられてしまいます。 unsigned short以外の型では問題は無いのですが。 見あたらなかったのですが既知の問題ですか?
コンパイルオプションの wchar_t をビルトイン型として扱う (/Zc:wchar_t) じゃない?
emacs + gtags でboostのコード閲覧がvisula studioみたいにできるけど debugで変数の動きとか追いかけるのもemacsでVisualStudioみたいに できる方法ないのかな
.NET Frameworkでvisual Studioの操作を外部プロセスから行う事が出来るから それをEmacsから操作できるようにするってのがまぁ妥当な方法かも ただし無駄に面倒だから恐らくやってる人は極少数 なんでVSにはコマンドラインデバッガが無いんだろうね…
Visual Studio は統合開発環境で、ホスト・アプリケーションだから。
むしろ Visual Studio にプロファイラがついていないことが疑問。 gprof みたいなやつって Windows だとなに?
2005から、ガイド付き最適化(GPO)ができた けど、使いにくいと個人的には思う
悔しい、2003なら無料のdevpartnerが使えるのに…!!
37 :
28 :2007/11/09(金) 21:01:15
>>29 ありがとうございます、その通りでした。
もう一度、そこら辺のドキュメントがないか見てみます。。。
>>34 >むしろ Visual Studio にプロファイラがついていないことが疑問。
Team Editionの一部にはついてるよ。
VTune + プロファイラー が intel からでていますよね? 結局それ以外使い物にならないのでは?
VTUNEはAMDのCPUでは使えないのだよ…
CodeAnalystでいいじゃん
bjam ver3.1.15-1経由でcl.exeのメッセージやワイド文字をコンソールに出力するアプリケーションでワイド文字を表示したら悉く???????と表示され、 いかにもロケール設定できてませんよって事態になります。 bjamを使わずに直接cl.exeやワイド文字を使うアプリを起動して表示すればちゃんと表示されのにも関わらずです。 以前のバージョンなら確かにcmd.exe以外のターミナルだろうが、cygwinのbashやzsh上だろうがNTemacsの中のシェルだろうが、 ちゃんと表示されてたんですが、皆様の環境ではどうでしょう?
44 :
43 :2007/11/11(日) 18:53:03
もろbjamの問題でした 適当なリビジョンのやつを落としてビルドしたバージョン3.1.14だとこの件に関しては正常に動作しました
boost 1331ではboot.pythonでnumpy使えないないのかね コンパイルは通るけど実行時にエラーでる
最新のstableの1.34.1もしくはSVN Headで試してみればどうでしょうか?
centosなのでpythonを2.4から2.5にあげるとシステムに不具合でるのです どうやら boost1.33.1 python2.4の組み合わせでしか動かないみたいです
48 :
デフォルトの名無しさん :2007/11/21(水) 19:49:45
boost::formatの逆のような処理を行うライブラリはありますか? try { unsigned short us = 0; int i = 0; (format("%1%, %2%") %us %i) = "0xABCD, -1234"; BOOST_CHECK_EQUAL(0xABCD, us); BOOST_CHECK_EQUAL(-1234, i); } catch(const format_error& e) { } 見たいな感じが理想です
それは正規表現の仕事だな 強いて挙げるならregexとかxpressiveか
>>48 要するにscanf()のboost版が欲しいわけだ
一言で言えば、無いよ
51 :
48 :2007/11/21(水) 20:07:58
了解しますた xpressive->lexical_cast戦法でいきます
なんでlexical_castなんぞ使うんだ?
intとかに変換したいからでしょ? 悪かないと思うが。
55 :
48 :2007/11/22(木) 16:09:45
>>54 こんなのあったのかー すごい・・・
でもasのなかでも呼ばれてるlexical_castが16進数とかを良きに計らってくれなくて俺涙目w
>>55 spirit と 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
notizキターw
notizと聞くと某ゴーストとか火狐のテーマとかを思い出す俺は異端かな
tupleをsinkやsourceにしてそれに対するfilterにしたらとても面白いかも・・・ でも今の僕にはその技術はありませんでしたというオチ
MFCやCLIを基本として、BoostだのLokiだのSTLだのATLだのWTLだのを 覚えなきゃならないなんて、C++は大変だな。 おまけにXMLやるならXML用のライブラリ、SQLやるならSQL用のライブラリと キリがない。 C++もういいよ。終了。
>>60 頭おかしいのかお前。
例えば、何の言語を使えば
MLやるのにXML用のライブラリを覚えなくていいのか
SQLやるのにSQL用のライブラリを覚えなくていいのか言ってみろ。
そうだね、プロテインだね。
そこはだがそれがいいと返すべき
全部言語仕様に入れたプログラミング言語作ろうぜ。 俺は見てるから。
Java厨乙が適切だと思う。そういう俺はD言語厨。
どんなにいいライブラリがあっても使いこなせない低脳さん乙と言ってあげるべき
MFCが基本と言ってる時点で(ry
大体基本って何だよ。 MFCはライブラリで、CLIは実行環境ジャン。
最近プロテインをプロティン(どちらかというとプロチン)と発音しているCMを見たんだけどこれって正しい?
俺は凡人だから、ちょっと頑張れば
>>60 が挙げたようなものは片っ端から使えるけど、
並外れて悪い頭を持って生まれてきた人には厳しいかもね。
ここはいい釣堀ですね
↑はいはーい、いつもの「カレ」のご登場でーす。パチパチ
恥かいた時のために、いつでも釣り竿を用意してます 「あ、ヤバ!」と思った時、どれだけ自然に「さっきから竿を構えていた」かのように振る舞えるかがコツ
>>73 後から釣りでしたって言った奴の負けだと思いますぅ〜♪
相手して付き合ってしまってる時点で負けだろ わざわざ同じレベルに堕ちる必要はあるまいて
おまえら、しょうがないなぁ unit nYakuso = 7; //薬草1個の値段 unit nFukuro[10]; //持ち物を入れる袋 wstring strIppai(L"持ち物が\nいっぱいです><") ; という文字列を以下のように変換するプログラムを30秒以内で記述できるか? unit、nYakuso、=、7、;、unit、nFukuro、[、10、]、;、wstring、strIppai、 (、L、"、持ち物が\nいっぱいです><、"、)、;
変数名の前に n とか str とか、自分は低脳ですって言ってるようなもんですよ
こういうのはperlとか使った方がよさそう
>>77 //以下の文字列を無視するのと
クォーテーション文字で囲まれた文字列内で
エスケープ文字を無視するのは標準Boostでは無理。
spiritなら頑張れるかも 30秒以内は無理そうだが xpressiveは知らない
ノcomment_p( )
30秒以内に記述してもコンパイルに30秒以上かかるんだよ・・・・
boost.pythonでboostとpythonのバージョン違いに悩まされるより swigの方がいいと思った swigと比べたboost.pythonの利点って何?
python コード呼び出すのがらくなことじゃねーの?
87 :
デフォルトの名無しさん :2007/11/26(月) 18:27:45
cmathの関数群とbindについて教えてください。 double 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ライブラリ固有の制限なんでしょうか?
std::cout << boost::bind<double>(&std::sqrt,_1)(x) << std::endl; bindがオーバーロード解決に失敗するときは戻り値の型をテンプレート引数で明示的に指定してやればいいらしいです
あごめん、やっぱ無理っぽい
>>87 もしかしたら、VCにはcmathのfloat版関数の宣言がないのではないか?
>>88 >>89 >>90 レスありがとうございます。
やはり複数の関数定義があるからなんでしょうかね。
実行はできるので、実装を受け入れることにします。
template特殊化じゃなくて、overloadだとね。 template<typename _Tp> inline _Tp mysqrt(_Tp __x) { return sqrt(__x); } なら、 cout << bind(mysqrt<double>, _1)(x) << endl; できるけど。doubleで特殊化されてようとされてなかろうと。
ただオーバーロードの名前解決ルールに従うとビッチリdoubleを 指定してるわけだからdouble sqrt(double)を特定できる はずなんですけどね。コンパイルエラーにもambiguousとは出ていない ようですし。
>93 double を指定しているのは戻り値の型であって、sqrt() の引数の型には寄与してないから特定できないんじゃない? x の型は bind の解釈には無関係だよね?
>>94 _1 は確か引数じゃないかな?戻り値ではないと思ったけど。
96 :
デフォルトの名無しさん :2007/11/29(木) 03:42:26
xpressiveを勉強しているのですがa|b(aまたはb)がうまく動きません using 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! で終わってしまいます
97 :
96 :2007/11/29(木) 03:46:41
申し訳ございません 間違えました 検証に使った文字列は const std::string addr("hoge!hoge!!hoge"); です
sregex tok = as_xpr("hoge") >> (("!!">>~before(eos)) | ("!">>~before(eos)) | eos); だろ。普通は
99 :
デフォルトの名無しさん :2007/11/29(木) 12:35:47
ファンクたを合成したいんだけど、 compose_f_gx_hx とかって Visual C++ 2005 の STL には入ってないの? ファンクタの合成って boost::compose か何かが必須? なんか俺勘違いしてるのかな。
100 :
99 :2007/11/29(木) 12:38:12
あれ?Boost.Compose って deprecated ?
lambda::bindを使って
bind(&f, bind(&g, _1))
な風に
でも
>>13 のように呼び出し規約が__stdcallの関数については使えないようだ
mlには使えるって書いてあるんだけどねぇ・・・誰か使えた人いないのかなぁ
102 :
99 :2007/11/29(木) 12:48:31
#include <boost/lambda/bind.hpp> boost::lambda::bind #include <boost/bind.hpp> boost::bind どちらを使うべきなのでしょうか?
合成関数目的ならどっちでもいけるけど __stdcallのものにでも使えるという点でboost::bindかな・・・
104 :
99 :2007/11/29(木) 12:56:54
THX. ところで、ファンクタの合成って標準のSTLには入ってないよね? SGIのだけに入ってるとか、そういうことあるのかな? 少なくとも Visual C++ だと compose_f_gx_hx などはありませんでした。 boost::bind のほうがもっと柔軟だから compose_f_gx_hx いらないけど。
>104 標準化される前の SGI STL には compose1, compose2 があった。っていうか今もある。 現行の標準規格には入っていない。 compose_f_gx_hx は Boost.Compose での名前。 C++0x では Bind が標準に入るので今後は bind 使えになると思われ。
107 :
99 :2007/11/30(金) 15:00:08
_1 とか _2 って boost::lambda 名前空間以下にしかないよね? boost::bind も併用しているんだけど、 そうすると ambiguous って言われる?
言われる
109 :
99 :2007/11/30(金) 15:15:54
だは〜 無名名前空間の下に見えてる _1 はどっから来たものか・・・ #include <boost/bind.hpp> だろうなぁ。 ::_1 って指定してやらないとダメみたい。
Visual C++ 2008 Express Edition だとさらに 果敢に IntelliSense が攻めてくれるね. だけどまた boost をリビルドしなきゃならんのか… 今からやろうと思うんだけど, svn trunk から とってきたのを直接ビルドしてみようと思う.無謀?
111 :
110 :2007/12/02(日) 18:58:00
112 :
110 :2007/12/02(日) 19:24:56
bjam ビルド中。 あっさり toolset 名として vc9 が検出されたみたい。 つーか、bjam をビルドしようとして build_dist.bat を 実行したらすでに本体のビルドまで勝手にやってくれているのだが・・・ 以前ビルドしたときとは大違いに楽になってる気がする。
ごめん、ウソ。いま改めて bjam.exe --build-dir=builddir --toolset=msvc-vc9express stage やってます。Express Edition は固有の toolset 名を持ってるのか? もしかして 64 ビット版のライブラリをビルドするか否かを決定してる?
114 :
110のチラシの裏 :2007/12/02(日) 19:37:30
しかし Graph とか正規表現ライブラリの Unicode サポートとか 使おうと思ったら expat や icu4c も vc9 でビルドしなおさなきゃ らんのかなぁ。 って、記憶をたどってみると、両ライブラリとも単独で使った ことがあるんだけど、vc7 と vc8 で同じバイナリをリンクしてた きがするのだが・・・ boost はなんでリビルドしなきゃならないの? とはいえ、 vc8 用にビルドした boost を vc9 でビルドしてる アプリケーションからリンクするとリンカが怒るので仕方ない。
Visual C++ 2008 Express Edition で 1.35 ビルド終了。 failed 2 って出たけど、どこで失敗したのかわからん。 bjam はログを残してくれないのか?
(bjam ほにゃらら 2> err.txt) > log.txt
え、Windows の cmd.exe でも stderr のリダイレクトできたのか。 bash ばっかりだからしらんかった。
118 :
110 :2007/12/03(月) 00:12:14
bjam で --toolset=msvc-vc90 にしてるのに libboost_graph-vc-mt-gd-1_35.lib みたいにライブラリファイルの名前中のツールセット名が -vc- になるのは、なぜ〜〜〜? 自分で変更するのタルい。
Boost.BuildがV2になった直後はそんな話も出てたような まぁperlかPowerShell使えばリネームなんて簡単だろ
前に同じような減少に見舞われたときは 原因を調べるもの面倒だったからファイル名を一括置換した なんでそうなるんだろうなあ
121 :
110 :2007/12/03(月) 05:34:34
>>119 まぁリネーム自体は簡単なんだろうけど,そもそも
ツールセット名ってどっかで正規化されていないのかと.
bjam で指定するツールセット名も msvc だけでも
受け入れられるし, msvc-vc8 や msvc-vc80 なども
変に柔軟に受け入れられるけど,オートリンクでは vc80
とか指定してくるし…
「自分でつけた名前だろ!自分でオートリンクできずにどうするよ!」
って突っ込みを入れたくなった.
122 :
110 :2007/12/03(月) 09:08:54
ツールセット名は msvc-8.0 と msvc-9.0 にすると ちゃんと vc80 と vc90 って文字がライブラリのファイル名に含まれます。 msvc / msvc-vc80 / msvc-vc90 も受け入れられるけど、 そうするとライブラリのファイル名におけるツールセットの部分が vc になってしまってオートリンクなどで都合が悪いです。
V:\boost-vc8>bjam --builddir=builddir --build-type=complete --toolset=msvc-8.0 stage V:\boost-vc9>bjam --builddir=builddir --build-type=complete --toolset=msvc-9.0 stage
124 :
デフォルトの名無しさん :2007/12/05(水) 12:27:20
BOOST_STRONG_TYPEDEF マクロって,テンプレート版ないのかな? typedef StrongTypedef<int> MyIntType; みたいに使いたい.自分で勝手に上のような使い方をしてるけど, 標準があるならそちらに従いたい. あと,BOOST_STRONG_TYPEDEF って totally_ordered しか 持っていないけど,もっと一般に additive とかそういうのを 持っているバージョンもあればいいと思う. さらに serialization にも対応してたらいいなぁ. #全部「おまえがやれ,自由に」と言われそうだけど #標準が決まってるほうが可読性が上がると思う.
>>124 > もっと一般に additive とかそういうのを
> 持っているバージョンもあればいいと思う.
具体的にはどういう型の時なの? additiveが有効なのは。
この辺は、 class NAME##_archetype { ってマクロでやってるから、
テンプレートに文字列処理がないとテンプレートだけでやるのは厳しいね。
126 :
デフォルトの名無しさん :2007/12/05(水) 21:17:01
bjamでビルドするときコンパイラに追加で渡したいフラグを設定するにはどのようにすればよいですか? warning 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のオプションとかで渡したいです
bjamのオプションもたぶんあるんだろうけど、 わかんなかったら環境変数CLを使えばよいんじゃないかな。
128 :
126 :2007/12/05(水) 21:45:28
わぉ 環境変数はずっとCFLAGSに設定してました ありがとうございます
129 :
デフォルトの名無しさん :2007/12/07(金) 07:57:36
scoped_ptr の実装を見て operator! が定義されているから safe bool idiom にしようとおもって scoped_ptr を 継承した my_scoped_ptr を作ったら conversion が ambiguous だって怒られた.
130 :
デフォルトの名無しさん :2007/12/07(金) 10:07:16
class A : public B のようにクラスを継承しています。 B に非侵入型の serialize が定義されている場合には A の serialize も非侵入型にしなくてはならないのでしょうか?
131 :
130 :2007/12/07(金) 11:04:41
すみません、自分の勘違いだったようです。
boost::serialization 関係でもうひとつですが,
BOOST_STRONG_TYPEDF で定義した型はそのまま
シリアライズできないのでしょうか?
自分で非侵入型の serialize を定義するべきですか?
http://boost.org/libs/serialization/doc/wrappers.html ここを見ると BOSOT_STRONG_TYPEDEF(T,D) で作った型 D
をシリアライズする際には T に自動的に変換されるので
そのままでいい、ということのようですし、実際
BOOST_STRONG_TYPEDEF マクロの定義を見ても
そこで定義されている構造体には確かに変換が用意されているようなのですが
Boost.Preprocessorで、BOOST_PP_CAT(t, Foo)が tFoo でなく tWFoo と展開されたのだが・・・ t が他の文字ならおkで、また別のプロジェクトだと tFoo と正しく展開された。 ずっと解決できないので誰かご教授ください m(_ _)m
>>132 tっていうマクロかtFooっていうマクロが定義されてるとか?
boost::bindで拘束する変数はコピー可能なオブジェクトでないと駄目ですか?
137 :
132 :2007/12/09(日) 05:28:54
>>133 左手のトークンの末尾が 't' だと駄目なようです。
BOOST_PP_CAT(Get, Hoge) とか BOOST_PP_CAT(Object, Piyo) とか。
>>137 それはもしかしてプリプロセッサのバグじゃないか?
使ってるプリプロセッサ何?
139 :
132 :2007/12/09(日) 08:59:35
>>138 VC++ Express 2005 です。
新規プロジェクト作り直して丸ごと移したら正常にコンパイル出来ました・・・
何か気持ち悪いけど、どこかプロジェクトの設定が壊れてたのだと思います。
お騒がせしました。
140 :
132 :2007/12/09(日) 09:49:06
と思ったらまた再発したorz 何だこれ
2005でboost使うのは辞めてくれ。 stdとtr1だけにしとけ
>>141 VC++7.1 は対応度高かったと思うけど 2005 だともしかして劣化してる?
2008 beta はどうなんだろ。
初耳だな
145 :
デフォルトの名無しさん :2007/12/09(日) 12:56:18
>>141 何の問題もないが.
時々 IntelliSense が黙るだけで.
VC9 ではかなり賢くなってる.
それでも boost::bind つかいまくりで
ファンクタ合成しまくりとかで黙ることもある.
VC8だとuBLASにlambdaにfunctionにmplまで使ったらclがエラーで落ちたことがあったな。 SP1当てたら大丈夫になったけどさ。
147 :
デフォルトの名無しさん :2007/12/10(月) 14:24:36
boost::shared_ptr の参照カウンタがゼロになったときに、 delete 以外の解放処理を行わせる方法はありますでしょうか。 extern IMalloc* allocator; { boost::shared_ptr<ITEMIDLIST> pidl((ITEMIDLIST*)allocator->Alloc(10)); } //ここでallocator->Freeを呼ばせたい
>>147 デリータを指定できるコンストラクタがあるよ。
template <typename U, typename D>
shared_ptr( U* ptr, D deleter);
149 :
147 :2007/12/10(月) 15:08:43
おぉぉ、ありがとうございます。 解決しますた。 クラス全体のテンプレート引数 (1個しか無い) にしか目がいってなくて、 コンストラクタのところを見てなかったです。orz
>>149 焦っている時にありがちな罠だから落ち着いて資料を読めばいいと思うよ。(自分への叱咤でもありorz)
msvc+stlportの環境下で、Boost Build v2で、boostをインストールした人って いませんか? VC++8 + STLport-5.1.4 に boost-1.34.1 を入れようとして、 Boostビルドまでは何とかこぎ着けたのですが(コンパイルエラーなしで)、 いざ、boostを使ったプログラムをメイクしようとすると、 error LNK2019: 未解決の外部シンボル "bool __cdecl boost::filesystem::native(class stlpd_std::basic_string<char,class stlpd_std::char_traits<char>,class stlpd_std::allocator<char> > const &)" (?native@filesystem@boost@@YA_NABV?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@@Z) が関数 _main で参照されました。 なんていうリンクエラーが出てしまいます。
ライブラリをリンクしろ。
153 :
デフォルトの名無しさん :2007/12/11(火) 08:58:58
環境の判定に BOOST_PLATFORM マクロを使おうと 思ってるんだけど、プリプロセッサって 文字列の比較できないよね? 環境の判定によいアイディアあったら教えてプリーズ。
154 :
151 :2007/12/11(火) 09:54:39
>>152 [ツール]→[オプション]→[プロジェクトおよびソリューション]→[VC++ディレクトリ]で、
ライブラリファイルのディレクトリとして、
C:\Boost\lib
を追加済みです。
さらに、プロジェクトのプロパティページで、
[構成プロパティ]→[リンカ]→[入力]→[追加の依存ファイル]で、
boost_filesystem-vc80-mt-gdp-1_34_1.lib
を追加してみたのですが、ダメでした。(:_;)
>>154 =151
普通は「追加の依存ファイル」なんて設定しなくても
オートリンクで適切なライブラリをリンクしてくれるはずなんだけどなぁ。
って STLPort 使ってない俺が言っても意味ないよね。
156 :
151 :2007/12/11(火) 14:38:29
>>155 のはずなんだけど・・・。
v1のときは、普通にリンクできていたので。
なんというv2。
何も情報を出さないのはアレなんで、
ビルドフロー(失敗している奴)をここにまとめておきます。
Visual C++ 8.0 with SP1
STLport-5.1.4
→ C:\STLport-5.1.4 として解凍。
boost-1.34.1
→ C:\boost-1_34_1 として解凍。
OS: Microsoft Windows SP2
CPU: Intel
157 :
151 :2007/12/11(火) 14:39:01
■STLport stlport/stl/config/user_config.h の #define _STLP_USE_BOOST_SUPPORT 1 を有効にする。 > "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat" を実行。 環境変数に、 STLP_BUILD_BOOST_PATH=C:\boost_1_34_1 を追加。 > cd build\lib > configure -c msvc8 --use-boost=C:\boost_1_34_1 > nmake /fmsvc.mak install でSTLPortをビルド。
158 :
151 :2007/12/11(火) 14:41:47
■boost
stlport.jamファイルの不具合を修正する。
http://lists.boost.org/boost-build/2007/08/17123.php参照 user-config.jamファイルを編集する。
using msvc : 8.0 ;
using stlport : 5.1.4 : C:/STLport-5.1.4 ;
環境変数を設定する。vsvars32.bat
@set STLPORT_PATH=C:\STLport-5.1.4
@set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;C:\S
TLport-5.1.4\stlport;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;C:\
Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program File
s\Microsoft Visual Studio 8\SDK\v2.0\include;%INCLUDE%
@set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;C:\STLport-
5.1.4\lib;C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\M
icrosoft Visual Studio 8\VC\PlatformSDK\lib;C:\Program Files\Microsoft Visual
Studio 8\SDK\v2.0\lib;%LIB%
(実際はそれぞれ1行です)
vsvars32-stlport.batにリネームして保存。
> "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32-stlport.bat"
ビルド。
> bjam --toolset=msvc stdlib=stlport --without-python install > build.log
build.logを見たら、
...updated 5631 targets...
でビルド成功。
159 :
151 :2007/12/11(火) 14:43:59
■試しに動かしてみる。
stlport、boostともインクルード・ライブラリそれぞれのディレクトリ
を追加。
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
using namespace boost::filesystem;
boost::filesystem::path outputFilePath( "C:\\hogehoge.txt", native );
boost::filesystem::fstream outputFile( outputFilePath );
//string s;
//double d;
//s = "53.0";
//d = boost::lexical_cast< double >( s );
//cout << "Hello world" << endl;
//outputFile << "Hello world!" << endl;
return 0;
}
でビルド。
すると、
>>151 のようなエラー。
チラシの裏みたいでごめん。
160 :
151 :2007/12/11(火) 14:46:34
↑にあるコメント行はゴミです。すまん。削除するのを忘れた。。 ビルドの要らないboostライブラリは普通に動きます。lexical_castとか。
multi_index_container.hpp なんてのがあるのか orz 俺の一週間の苦労はなんだったんだ…… お前ら、先に教えてくれよ…… λ....トボトボ
163 :
161 :2007/12/12(水) 08:08:55
さすがにインデックス3つ使って複雑なコンテナ作ると, Visual C++ 2008 でも IntelliSense が死ぬね. でも補完機能は IntelliSense がぴか一だと思うんだけど, それでも追い切れないとは…
うーむ、2008はそんなにIntelliSenseがいいのか 2005Pro持ってるけどどうしようかなあ…
165 :
161 :2007/12/12(水) 08:46:11
>>164 俺も自前で頑張って買った 2005 Professional 使ってたけど,
今は 2008 Express Edition 使ってます.
VC++ スレでは IntelliSense 糞とかいう書き込みを見かけるけど
マクロとテンプレートでの変態プレイにここまで対応してるのは
2005 レベルでもすげぇとおもう.
単に自分が Eclipse の設定をちゃんとしてないからかもしれません.
標準ライブラリまで指定してフルインデックスすれば
Eclipse の CDT でもちゃんと型追っかけてくれるんでしょうかね.
ええ。 けど使い慣れたのを使うのが一番だと思います。 ちとスレ違いだしね。
2008ってExpress出てるのかよ
英語版だろ
英語版でもいいよ
170 :
デフォルトの名無しさん :2007/12/12(水) 19:51:46
以下のように、可変個引数(モドキ)をとる関数をtupleを使って作りたかったんですが、 行き詰まりました。関数内でtuple要素全てにアクセスする方法はありますか? 可変個引数が可能ならばtupleじゃなくても構いません。ちなみに、引数の型はすべて一緒です。 template<typename T> void multi_args(const T& arg){ for(int i = 0 ;i< tuples::length<T>::value ;++i){ //tuple要素すべてにアクセスしたい //arg.get<i>() は当然だめ } } int main(){ multi_args( make_tuple(1,2,3) ); return 0; }
>>170 素朴な疑問なんだが、std::vectorじゃいけない特別な理由でも?
# まぁ、vectorだと即値を列挙することはできないわけだが。
>>170 boost::fusionならfor_eachができるんだが
ループ内で全要素にアクセスってのは無理だな。
boost fusion について日本語で解説したページってある?
NiceBoost
>>170 boost::assign::list_of
>>170 tuple って単に car が get_head で、cdr が get_tail なので、
tuple_for_each(t, f) { f(t.get_head()); tuple_for_each(t.get_tail(), f); }
tuple_for_each(null_type, f) {}
とかを作ってしまえばいい
で、なぜか iterator/zip_iterator.hpp の detail 内にあったりするわけだが
boost::multi_index_container で boost::multi_index_container::tag を使うと Visual C++ 2008 ではエラーになる. C1001 なので原因がよくわからない.
bindとlanbdaを同時に使うとき #include <boost/bind.hpp> #include <boost/lambda/lambda.hpp> using namespace boost; using namespace boost::lambda; とすると、_1 を使ったときコンパイルできなくなる。 boost::lambda::_1 なんてやるとコンパイルできる。 プレースホルダー _1 ってbind.hppでもlambda.hppでも 重複して定義されてる?
俺、ファンクタの合成くらいにしか使わないので、 結局 boost::bind だけしか使わないようにした。 って、それじゃ根本的な解決になってないか。
>>178 その通り
usingの代わりにnamespaceの短縮名を使うと良いと思う
>>180 ありがとう。
で、namespaceの短縮名とは何ですか?
boost::lambda::_1のように常に明示的に
指定するということですか?
>>181 namespace bl = boost::lambda;
>>182 ありがとう。
別名を与えられることは知りませんでした。
これで対応していきます。
bjamのv2の使い方が良く分からないんですが、例えば以下をv2で 書く場合、どのように書いたら良いんでしょうか? #bjam -sTOOLS=mingw "-sBUILD=release <runtime-link>static <threading>multi <native-wchar_t>on" --prefix=/c/msys/1.0/local install
libcgi とか libcgi++ とか libcurl の asio 利用版 なんてのもでてくるのかね?
sregex r = sregex::compile( "A([1-9]*|[a-z]*)A" ); string str1 = "A123A AaaaA A3b3A A9A"; if( regex_search( str1, m, r ) ) { ... } で、 "123" "aaa" "3b3" "9" という文字列を取り出すにはどういう記述をすればいいでしょうか? m[2].str() とか書いても、aaaとか取得できないんです。 sregexでなくxpressive利用でもいいです。
const_iterator begin()const; Effects: Returns a starting iterator that enumerates over all the marked sub-expression matches stored in *this. const_iterator end()const; Effects: Returns a terminating iterator that enumerates over all the marked sub-expression matches stored in *this.
regex_searchじゃなくてregrex_iteratorでも使っとけ
regex_searchで 最小マッチ?を指定するとダイアログ出て落ちるんです
エスパー魔美
192 :
デフォルトの名無しさん :2007/12/16(日) 20:37:23
Resist the temptation to just cast *this to the base class.
This might seem to work but may fail to invoke code necessary
for proper serialization.
マニュアルにはこう書かれているけど,かといって private で
継承した基底クラスをシリアライズするためには
>>191 みたいにしないとだめだよねぇ?
193 :
デフォルトの名無しさん :2007/12/17(月) 10:40:42
http://www.boost.org/libs/serialization/example/demo_shared_ptr.cpp ここには基底クラス A の shared_ptr に派生クラス B のポインタを
持たせてシリアライズしています。なお、 A は仮想デストラクタを
持っています。このとき
boost::archive::text_oarchive oa(ofs);
oa.register_type(static_cast<B *>(NULL));
oa.register_type(
static_cast<
boost::detail::sp_counted_base_impl<
B *, boost::checked_deleter<B>
> *
のように register_type しなければならないようなのですが、
BOOST_CLASS_EXPORT マクロのようなもので登録できない
ものでしょうか? archive を生成してから毎回登録するのは
忘れてしまいがちなので。
194 :
193 :2007/12/17(月) 11:14:31
195 :
193 :2007/12/17(月) 11:24:03
196 :
193 :2007/12/17(月) 11:25:44
他言語→多言語 orz しかも sage てなかった orz-----3
Boost と POCO ってなかよしなの? asio とか filesystem とかかぶってるみたいだけど.
VS 2008 EE 日本語版
class B{ public: virtual void mf(); }; class D : public B { public: void mf(); }; のように継承関係にあるクラスについて shared_ptrはポリモルフィックに動作しますか? つまり、 shared_ptr<B> bp(new D); bp->mf() で D::mf() が呼ばれることはboostの仕様として 保障されてますか?
はい
thx
#include "stdafx.h" #include <iostream> #include <boost/lambda/lambda.hpp> #include <boost/lambda/if.hpp> #include <vector> #include <algorithm> using namespace std; namespace bl = boost::lambda; int main() { unsigned int a[] = {0, 1, 1, 0, 1, 0, 0, 1}; for_each(a, a + sizeof(a)/sizeof(a[0]), bl::if_(bl::_1 % 2 == 0) [cout << "偶数\n"].else_[ cout << "奇数\n"] ); } これをコンパイルすると private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。 とエラーが出てコンパイルできません。原因は何でしょうか? VC++ 2008 コンソールアプリケーションです。
203 :
202 :2007/12/21(金) 00:44:29
自己解決しました。
わざわざ通知ありがとうございました。
205 :
デフォルトの名無しさん :2007/12/21(金) 12:42:34
boost::bind(&ClassA::MethodB, this, _1) みたいなファンクタを生成するとき,ClassA に MethodB が複数 (void MethodB(int) と void MethodB(double)とか) 定義されていたら,どちらのメンバ関数ポインタになるんでしょうか?
206 :
デフォルトの名無しさん :2007/12/21(金) 12:57:01
207 :
205 :2007/12/21(金) 13:06:06
パッケージは exe だけど,実体は自己展開 cab なので 拡張子を cab に変えればたいていのアーカイバで開けます. あと,ランタイムに関してですが /MD と /MDd です.
208 :
206 :2007/12/21(金) 13:06:56
名前欄間違えた.
>>205 static_cast<void (ClassA::*)(int)>(&ClassA::MethodB)
みたいに明示的にキャストしないと通らないと思った。
>>209 ∩
( ⌒) ∩_ _
/,. ノ i .,,E)
./ /" / /" .
_n グッジョブ!! ./ /_、_ / ノ'
( l _、_ / / ,_ノ` )/ /_、_ グッジョブ!!
\ \ ( <_,` )( /( ,_ノ` ) n
ヽ___ ̄ ̄ ノ ヽ |  ̄ \ ( E)
/ / \ ヽフ / ヽ ヽ_//
VC9用をいただきました
211 :
210 :2007/12/21(金) 19:13:04
正規表現で調べる文字列にcharやwchar_tの配列は使用できないのでしょうか
>>212 char*やイテレータを取るバージョンがあるはずだが
>>213 以前のバージョンということですか?
できればxpressiveで書きたいので、最近のバージョンを使いたいのですが
それでは無理ってことでしょうか
バージョンと言うかオーバーロードな と言うかリファレンス見たら?
つか入力にイテレータ取るバージョンがあれば当然ポインタ食わせられるだろ。
219 :
デフォルトの名無しさん :2007/12/24(月) 08:12:02
std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); std::for_each(v.begin(), v.end(), boost::bind(operator<<, std::cout, _1)); このようにして各要素を出力することはできないのでしょうか? なぜだか error C2065: '<<' : undeclared identifier と言われてコンパイルできません.
220 :
219 :2007/12/24(月) 08:54:23
コンパイルできない理由はちょっとわからんけど、これじゃダメなん? std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout));
>>220 g++だと<unresolved overloaded function type>と言われたのでstatic_castしたら通った。
std::for_each(v.begin(), v.end(), boost::bind(
static_cast<A &(A::*)(int)>(&A::operator =),
&a,
_1));
>>219 intを出力するoperator <<は、cout (std::basic_ostream)のメンバ関数だから、
そのコードでは、正しいoperator <<へ辿り着けない。
もっとも、それ以前の問題でコンパイルエラーになっているようだが。
今回は221のいうとおりostream_iteratorもあるし、
その他演算子一般の場合は、bind使えなくてもlambdaがある。
224 :
219 :2007/12/24(月) 09:48:19
>>221 いや,もちろんそれでやりたいこととしてはOKなんですが,
一般的な演算子を指定できれば応用範囲も広がるかなと思って.
>>222 VC9 だとテンプレートを検索しまくって
「あれでもない,これでもない」と C2780 を連発した揚句,
時々 ambiguous だというエラーも出るんですよ.
なるほど, g++ でもそのままでは通らなくて,
static_cast すれば通るんですね. operator() だと問題なくて
operator= だと問題になる理由がわからないですが.
既定の代入演算子が別途用意されてしまうからかなぁ.
自前で = をオーバーロードした時って既定の = は
定義されないんでしたっけ?
でも独自にコンストラクタを作ってもコピーコンストラクタは
勝手に作られていたような気がする.
225 :
219 :2007/12/24(月) 09:51:05
>>223 なるほど,それで operator<< が見つからないと怒られてるんですね.
たぶんグローバル名前空間の operator<< を探しに行って「無い」
と怒ってるように思います.
自分はてっきりストリームの << 演算子はグローバル名前空間に
定義されていて必要なクラスに friend 指定されているのだと
思っていました.
>>224 boost::bindはlambdaと違って一旦メンバーポインタにするから。
だからoverloadされてるとまずい。
-------------------------------------------------------- 以下抜粋 bool A::foo(int) const; A a; vector<int> ints; ... find_if(ints.begin(), ints.end(), bind(&A::foo, a, _1)); find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1)); --------------------------------------------------------- この形式でboost::lambda:bindを使う場合、非constメンバー関数を 指定するとコンパイルが失敗するのですが、constメンバー 関数しか渡せないという仕様なのでしょうか? 試したのはVC++ 2008です。以下がエラー内容です。 error C2665: 'boost::lambda::function_adaptor<Func>::apply' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
228 :
219 :2007/12/24(月) 14:12:29
>>227 find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
で,a が const じゃないからじゃね?
間違ってたらごめんne
うぉ,名前付けてしもうた.
>>228 find_if(ints.begin(), ints.end(), bind(&A::foo, a, _1));
参照渡しのこちらの形式で制限があることが記載されていました。
aはconstオブジェクトとしてファンクタに保持されるらしいので
constメンバー関数しか呼べないみたいです。回避策として
ref(a)を渡せばよいらしく、これでうまくいきました。
ポインタ形式のほうはポインタのコピーなので問題ありません。
find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
boost::tuples::tuple<T1,T2,...> を投入して, T1 をキーとして扱ってくれる map ってないものでしょうか? std::for_each で処理する時,std::pair<Key, Value> の インスタンスが順にファンクタに渡されますが, そうではなくて Value だけを次々と渡してほしいので, boost::tuples::get<1> などで値が取り出せる tuples が 便利なのですが・・・ boost::multi_index がそれに該当するのでしょうか?
T1部分だけで比較する関数オブジェクトを持たせたsetはどうだろう?
233 :
デフォルトの名無しさん :2007/12/25(火) 19:03:30
struct A { template <typename Args> struct sig { //typedef ??? type; }; int operator()(int x) const; void operator()(int x, int y) const; }; lambda式で使うファンクタの定義で、上のように引数の数が違い、 かつ戻り値の型も違う複数の関数呼び出し演算子を定義したい場合、 sigでどのようにtypeを表現したらいいのでしょうか?
boost::iostreams使ってるんだけど、 struct my_device { typedef char char_type; struct category : bidirectional_device_tag, closable_tag {}; std::streamsize read( char_type *s, std::streamsize n ) {} std::streamsize write( const char_type *s, std::streamsize n ) {} void close( std::ios::openmode which = std::ios::in | std::ios::out ) {} }; int main() { my_device dev; stream<my_device> ss( dev ); ss.get(); char ch; ss >> ch; } このとき、get()してるはずなのに、my_device::read()の引数nの値が 4096になっているのはなぜ??n=1で呼ばれて欲しいんだが。 operator >> を使った場合も同じくn=4096。 4096ってのは、バッファのサイズか何かだとは思うんだが・・・。 ソース見てもテンプレート使いまくりで、どこで呼び出してるのかさっぱりわからん。。。 誰かわかる人いる? ちなみに環境はWinXP + VC8です。
>>235 回答ありがとうございます。
バッファのサイズを1にするだけだと、上のコードは通りますが、
ss.read( buf, sizeof( buf ) );
みたいな使い方をするときに効率が悪い気がするんですが。
ほかにいい方法ありませんか?
>>233 Argsを調べて適当にディスパッチしてやれば良い。例えば引数の数で分けるなら、
template <typename Args>
struct sig
{
typedef typename boost::mpl::if_c<
boost::tuples::length<Args>::value == 2, /* 関数オブジェクトと引数一つで合計2 */
int,
void>::type type;
};
試してないけど、typename Args::inheritedでconsリストを得て、
それに対して部分特殊化でパターンマッチすることもできるはず。
>>236 my_device::readの引数nが4096でも戻り値で1を返しとけばいいんじゃないかな?
でもmy_device::readが一度に1しか読めない仕様(234より)だから
ss.read( buf, sizeof( buf ) )ってやるとsizeof(buf)回呼び出されて効率悪いけど・・・
>>238-239 ありがとうございます。
my_device::read()の引数nがインデックスではないのは理解しているつもりです。
作っているmy_deviceがrs232cの通信インターフェースなので、
stream<my_device> ss;
ss.get();
のときに、タイムアウトするまで制御が戻ってこないと不都合があったのです。
※1文字受信していても、n==4096なので、ReadFileしたときに制御が戻ってこない
なので、
ss.read( buf, sizeof( buf ) );
のときにはsizeof( buf )分だけ、
ss.get()
のときには1文字分だけ読み込む処理がしたかったのです。
iostream拡張は今までやったことがなく、stream_bufのバッファリングの仕組みは
まだよくわかっていなのですが、仕様っぽい気がしてきました。
他の方法で解決できないか試してみます。
>>237 レスありがとうございます。
mplやconsリストというのを未だ知らないので
まずはこれを調べて見ます。
242 :
234 :2007/12/26(水) 00:00:09
自己解決しました。
my_device::read()内で、受信バッファのデータ数を調べ、
その分だけReadFileすることで解決しました。
>>235 ,
>>238-239 助言ありがとうございました。
struct A { template <typename Args> struct sig { typedef ?? type; }; int operator()(int x) const; double operator()(double) const; void operator()(int x, int y) const; }; 上のようなファンクタの場合、型の違いによって、 typeを振り分けるにはcons listから型を抽出して is_same<>で型を判定するという方法で可能でしょうか? sigの部分的特殊化の方法か何かで Args::inherited が cons<A, double> を表すように仕組んで、 boost::tuples::element<1, Args>::type とcons<A, double>のdoubleの比較一致を 試すというようなことができれば実現できるのかなと 思っているのですが。
>>243 ごめん、上でArgs::inheritedとか書いたけど無視してくれ
Argsがタプルならこの方法でconsリストを取り出せるけど、Argsとして渡されるのは最初からconsリストだった。
で、そのファンクタの場合も、boost::tuples::elementとis_sameとif_cでちまちまテストしてもいいし、
部分特殊化で一気にディスパッチしてもいい。
後者なら、メンバテンプレートは特殊化できないので、こんな感じで。
namespace detail {
namespace bt = boost::tuples;
template <typename Args> struct A_sig;
template <typename Fun>
struct A_sig<bt::cons<Fun, bt::cons<int, bt::null_type> > > { typedef int type; };
template <typename Fun>
struct A_sig<bt::cons<Fun, bt::cons<double, bt::null_type> > > { typedef double type; };
template <typename Fun>
struct A_sig<bt::cons<Fun, bt::cons<int, bt::cons<int, bt::null_type> > > > { typedef void type; };
}
struct A {
template <typename Args>
struct sig { typedef typename detail::A_sig<Args>::type type; };
/* 以下略 */
std::ostringstream のインスタンス oss から boost::archive::binary_oarchive bo(oss) として bo にいろんなクラスを流し込んだ挙句, oss.str() で std::string を取り出して プログラム内でやり取りすることはできますか? つまり,std::ostringstream にバイナリを 流し込んでいいのか?ということなんですが・・・ (その点に絞ると Boost スレとはスレ違いですみません)
246 :
デフォルトの名無しさん :2007/12/26(水) 10:04:57
Boost にはガベコレの昨日は入らないんでしょうか? Boehm GC に似たやつとか
BoehmさんがWG21でやってる。
248 :
デフォルトの名無しさん :2007/12/26(水) 12:23:05
>>247 今いくつか記事読んだ.
ライブラリとしてではなくて完全に言語使用に取り込もうとしているんだね.
C++/CLI の gcnew のように新しく「ハンドル」を持ち込むわけではないんだな.
ということは結局実装は Boehm GC のような conservative GC だってことだね.
>>244 レスありがとうございます。
アイデアよくわかりました。この考えに従って
自作プログラムをコンパイルしたところ、引数が一つのもの
については成功し実行もできました。
//aはint配列あるいはdouble配列
for_each(a, a + 3, bl::bind(A(), bl::_1)); // OK
ただ、以下はコンパイルエラーとなりました。
//aはint配列
for_each(a, a + 3, bl::bind(A(), bl::_1, 100)); //コンパイルNG
引数が二つ以上のものが実体化されるときにエラーとなるようです。
”認識できない型”と怒られているので、おそらく
bt::cons<Fun, bt::cons<int, bt::cons<int, bt::null_type>が
実体化できない原因かなと思ってるのですが定かではありません。
consの形式自体はヘッドとテイルの2引数を与えていて、bl::null_type
も空の構造体として存在していましたので、型認識に問題は
なさそうなんですが、null_typeが連続して出てくるた
長い行が報告されます。(VC++ 2005 Eepress Edition)
boost::tuples::cons<const A,boost::tuples::cons<int,boost::tuples::cons<const
int,boost::tuples::detail::map_tuple_to_cons<boost::tuples::null_type,bo
ost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type
,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_t
ype,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::nul
l_type>::type>>>
// Tuple to cons mapper ------------------------------------------------ // The empty tuple is a null_type template <> struct map_tuple_to_cons<null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type> { typedef null_type type; }; ソースを見る限りではnull_typeと正しく判断されてもよいと 思うのですが。
>>249 第二引数の型がintじゃなくてconst intとして与えられてるから特殊化にマッチしないみたいだ。
ディスパッチの前にremove_cvをかければ良いんだけど、
consリストはMPLシーケンスの要件を満たしていないみたいでtransformが使えない。
仕方ないから自分で再帰してみたら動いた。
template <typename List> struct list_remove_cv;
template <>
struct list_remove_cv<bt::null_type> { typedef bt::null_type type; };
template <typename Head, typename Tail>
struct list_remove_cv<bt::cons<Head, Tail> >
{
typedef bt::cons<
typename boost::remove_cv<Head>::type,
typename list_remove_cv<Tail>::type
> type;
};
これをやるくらいならelementとif_cで判別した方が楽かもしれない。
もうphenixとか使った方がいいな
>>251 毎度ありがとうございます。
難しいですね。。
自分ではまだそのようなコードは書けないです。
ただ、可能だということが分かっただけで
十分助かりました。引数型についてはelementで
引数の数についてはboost::tuples::lengthを使って
うまく組み合わせてみます。
254 :
デフォルトの名無しさん :2007/12/26(水) 23:56:46
bjam を使って Visual C++ 用にビルドした場合, ランタイムのリンク方法はどのようになるのでしょうか? /MT & /MTd か /MD & /MDd のいずれなのでしょうか?
>>254 オートリンクが、そのときの設定に合わせて自動でやってくれるので、
何もしなくてよい。
256 :
デフォルトの名無しさん :2007/12/27(木) 00:18:37
/ML = -s /MLd = -sgd /MD = -mt-s /MDd = -mt-s-gd /MT = -mt /MTd = -mt-gd が全部用意されるのか・・・ /ML と /MLd は vc8 や vc9 ではすでにサポートされていないようなので /MT と /MTd と同じものがビルドされているみたいだね.
257 :
デフォルトの名無しさん :2007/12/27(木) 10:18:22
bjam 使ってビルドすると、たとえば libboost_date_time-vc90-mt-gd-1_35.lib libboost_date_time-vc90-mt-gd.lib みたいにバージョンが入ったものとそうでないものが ビルドされるけど、どちらか一方だけがリンカの パスに見つかれば問題ないの? それもオートリンクでどちらかが先に見つかって解決?
名前マングリングの有無について設定するマクロがあったような…。
259 :
245 :2007/12/27(木) 13:12:05
うぉ、std::string に binary_oarchive で流し込んで 持ち歩けることを確認、って当たり前かもしれないけど、 ちょっと感動。 make_nvp で作った std::pair をやり取りする 連想記憶(ってただの multimap だけど)を 作って便利に使ってます。 しかし boost::archive のフォーマットが変わるかもしれないので ちゃんと serialize で version をチェックしなきゃなぁ、 バイナリだし何が起こるかわからない。
260 :
245 :2007/12/28(金) 14:46:50
はまった(笑 制御文字を含むような std::string を boost::archive::xml_oarchive に 流し込むと XML 文書がぶっ壊れる.うむ〜.
nifty規制解除キタ━━━━(゚∀゚)━━━━!!! 記念に糞patch晒し。 phoenixでstd::mapにoperator[]が使えなくて、渋々phoenix::binary_operatorを特殊化したら boost::graph内(boost/graph/detail/read_graphviz_spirit.hpp)でも同じことやってるの見つけて ブチ切れ気味にspecializations for stl iterators and containersとやらを修正してみた。 $ diff -u special_ops.hpp.orig special_ops.hpp --- special_ops.hpp.orig 2007-12-25 10:49:20.000000000 +0900 +++ special_ops.hpp 2007-12-25 22:08:29.671875000 +0900 @@ -21,6 +21,8 @@ /////////////////////////////////////////////////////////////////////////////// #include <boost/spirit/phoenix/operators.hpp> #include <iosfwd> +#include <boost/typeof/typeof.hpp> +#include <boost/utility/result_of.hpp> /////////////////////////////////////////////////////////////////////////////// #if defined(_STLPORT_VERSION) && defined(__STL_USE_OWN_NAMESPACE) @@ -320,7 +322,8 @@ template <typename T0, typename T1> struct binary_operator<index_op, T0, T1> { - typedef typename T0::reference result_type; + typedef BOOST_TYPEOF_TPL(&T0::operator[]) index_op_t; + typedef typename boost::result_of<index_op_t(T1)>::type result_type; static result_type eval(T0& container, T1 const& index) { return container[index]; } };
263 :
デフォルトの名無しさん :2007/12/29(土) 14:07:18
>>262 何いちいち反応しているの?
興味がないなら無視すればいいだけだろ
#include <boost/current_function.hpp>
により Visual C++ では
#define BOOST_CURRENT_FUNCTION __FUNCSIG__
にされてしまうのはなぜ?
Visual C++ なら __FUNCTION__ があるので
#define BOOST_CURRENT_FUNCTION __FUNCTION__
にならないといけないはずなのに
>>263 いやいや興味はあるよ。
“自意識過剰なのか”という点についてね。
265 :
デフォルトの名無しさん :2007/12/29(土) 15:22:05
void foo(){} void bar(){} boost::function<void(void)> f1 = foo; boost::function<void(void)> f2 = bar; assert(!(f1 == f2)) なぜこの比較が通らないんでしょうか? assert(f1 == foo) なら通るんですが・・ boost::function のインスタンス同士の 比較はできないのでしょうか? 単純に関数ポインタの比較のようなことをしてくれればいいのですが.
266 :
265 :2007/12/29(土) 15:52:01
gcc4.1だと1.34.1よりsvn headの方が不具合が少ないような気がするんですが 気のせいですよね?
1.34.1後にバグが修正されてるのだっていっぱいあるんだろうから 不思議ではないだろ
270 :
デフォルトの名無しさん :2007/12/31(月) 23:49:00
Boost ではデバッグバージョンのライブラリと通常バージョンの ライブラリが用意されていますよね、普通。たとえば bjam でビルドすると両方のライブラリが作られるし、 Debian GNU/Linux や Ubuntu で boost-dbg を入れると デバッグ用のライブラリが /usr/lib 以下に入り、 通常バージョンのライブラリと同居します。 で、ふと思ったのですが、Linux の一般的なディストリビューション (RHEL や Debian) で libhoge, libhoge-dev を入れると /usr/lib 以下に入る libhoge.a や libhoge.so は一種類だけで 特にデバッグバージョンと通常バージョンという区別はありません。 Linux のディストリビューションではパッケージングの際に デバッグ情報をつけるか否か、デバッガで扱えるように 最適化をオフにするか否か、などについて取り決めがあるのでしょうか?
271 :
デフォルトの名無しさん :2008/01/02(水) 12:19:06
1.35 って asio まわりの頻繁なコミットが終わったら リリースされるのかな?
GILがまともに使えるようになってからにしてほしいな。 jpegとpngの読み込みを正式にコミットして、 pngも通過色とかまともに対応して、 スケーリングなども用意して。
273 :
デフォルトの名無しさん :2008/01/02(水) 16:29:41
GILとは?generic imaging libraryかなんか?
274 :
デフォルトの名無しさん :2008/01/03(木) 02:20:39
VC++8.0とboost1.34.1を使って開発しています。 struct my_device { typedef char char_type; typedef bidirectional_device_tag category; streamsize read(char_type *s, streamsize n); streamsize write(const char_type *s, streamsize n); }; int main() { my_device device; stream<my_device> s(device); char one = 'b', two = 0; s.put(one); s.get(two); } my_device::write my_device::read の順番で呼ばれると思ったのですが、なぜかmy_device::readのほうしか呼ばれません。 なぜこのようになるのかご存じの方がいらっしゃいましたら教えてください。
275 :
デフォルトの名無しさん :2008/01/03(木) 07:35:44
Boost Graph Library (BGL) 使っている人いますか? BGL ではグラフの頂点や辺にプロパティを設定して 値を持たせることができますが(たとえば「色」とか), ある値をプロパティとして持つ頂点や辺を高速に 列挙させることはできるのでしょうか? 頂点イテレータなどで全探索して列挙するのはつらいので, プロパティマップを boost::multi_map::multi_map_container などをつかってキーでも値でもインデックスされているような コンテナでプロパティを保持できればと思っているのですが. 外部プロパティとして持てばよいのではないかとも思うのですが, たとえば boost::print_graph は vertex_index_t を内部プロパティ として持っていることを前提に作られているので, 内部プロパティの持ち方を指定してうまくやれればいいと思っています.
こういうものを作ったんですけど、もしかして似たようなものがboostにありますか? もしあるのだったらboostの方を使いたいです。 int var; //キャストが必要な長い式 var = (int)(0.123456789 * 9.87654321 / 0.123456789); //「キャストをする」と表明するだけで //具体的な型や乱雑な括弧が必要ない var | mycast = 0.123456789 * 9.87654321 / 0.123456789;
仕様の詳細(初期化のみ?コピー等の動作は?)がよくわからんが、BOOST_AUTOみたいなもんかね。
仕様というか、単に=よりも結合順位の高い演算子で左辺の参照を受け取って operator =で右辺を代入してるだけ。
どういうときに使うの?
「キャストをする」と表明するしたいだけで具体的な型や乱雑な括弧を書きたくない時。
BOOST_AUTOって変数になるトークンと初期化式を書いて 初期化式の型から変数の型を判断するやつだね。 俺が書いたのは単に代入用だけだよ。
template<typename T> class auto_cast_wrarapper { T& obj_; public: auto_cast_wrarapper(T& obj) : obj_(obj) {} template<typename U> T& operator=(U const& obj) { return obj_ = static_cast<T>(obj); } }; class auto_cast {}; template<typename T> auto_cast_wrarapper<T> operator|(T const& lhs, auto_cast rhs) { return auto_cast_wrarapper<T>(lhs); } static auto_cast mycast; こんな感じかな。まあboost::enable_ifとか使ってもうちょっと上手く実装してるとは思うけど。 とりあえずboostに同様のものは無かったと思われ。
283 :
282 :2008/01/03(木) 09:39:57
wrarapperってなんだorz wrapperね。
乱雑な括弧もなにも、右辺全体を一組の括弧で括るだけじゃないか。
まあ、Cのキャストを使ってる時点でなんだかなぁ、と思う。 varがint形とdouble形のコンストラクタと代入演算子を持っていて、 それぞれ意味が違う場合はどうするの?
組み込み方にしか適応できない様にする。
>274
単にバッファリングされてるだけなんじゃないの?
>Note that the Iostreams library provides buffering by default. Consequently, the stream out must be flushed before
>the characters written are guaranteed to be reflected in the underlying string.
>
http://www.boost.org/libs/iostreams/doc/tutorial/container_sink.html >275
「BGLでは」ではなくて、むしろ「adjacency_list と adjacency_map では」が正しいんじゃないの?
内部プロパティに対するアクセス方法としては、PropertyGraph か MutablePropertyGraph に対応するものしか
用意されてないし、EdgeList とかの持ち方はカスタマイズできるけど内部プロパティの持ち方はカスタマイズできないと思う。
で、内部プロパティと外部プロパティを併用したら駄目なん?
あるいは、いっそのこと、自分で BGL の Concept に沿ったクラスを作っちゃえばいいんじゃないかな?
274です。 writeの後にflushをしたら期待した動作になりました。 ありがとうございました。
289 :
デフォルトの名無しさん :2008/01/03(木) 19:17:02
>>287 そうですね.外部プロパティとの併用にします.
BGL って Graphviz への出力もできるし,
その時の VertexPropertyWriter は
boost::bind や boost::lambda でファンクタ
自在に作れるし,便利ですね.
290 :
デフォルトの名無しさん :2008/01/04(金) 01:55:41
string の vector の vector について、 各要素を std::cout に出力したいとき、 boost::bind でうまくファンクタかけないかな?
3行目が全く意味不明
292 :
デフォルトの名無しさん :2008/01/04(金) 10:47:30
>>291 std::vector<std::string> の参照を受け取ると
その内容を全部ずらずらと書き出すようなファンクタを
コードの途中で必要に応じて作り出せないだろうかということです。
>>292 void operator()(const std::vector<std::string>& v)
{
std::copy(v.begin(), v.end(), ostream_iterator<std::string>(cout, " "));
}
とかじゃだめなのか?何でboost::bindが必要なんだ?
void operator()(const std::vector<std::string>& v) const { std::copy(v.begin(), v.end(), ostream_iterator<std::string>(cout, " ")); } constつけた。
某ソフトウェアをビルドしようとして ./configureやると checking whether the Boost::DateTime library is available... yes checking for main in -lboost_date_time... no configure: error: Unable to find Boost.DateTime library, currently this is required. って出て失敗するので,Boostライブラリを手動インストールしたのですが認識してくれません. # ldconfig -v で確かに libboost_date_time-gcc41-mt-1_34_1.so.1.34.1 -> libboost_date_time-gcc41-mt.so libboost_date_time-gcc41-1_34_1.so.1.34.1 -> libboost_date_time-gcc41.so と追加されているはずなのですが,configuregが認識していないようです. これどうやったら直りますか? ちなみにyumで自動インストールするといけるのですが,自分はboost::filesystemとか使いたいので bjamつかって自前でビルドしてインストールしました.
298 :
297 :2008/01/09(水) 20:04:41
すみません環境を書き忘れました. Fedora Core 6でカーネルのバージョンが2.6.18-1.2798.fc6です 宜しくお願いいたします.
/etc/ld.so.conf.d/ に boost.conf とかいう名前のファイル作ってboostインストールしたパスを書く /usr/local/boost/lib とか それから #ldconfig
develパッケージをインスコしてないだけじゃねーの
>>299 やってみましたが駄目でした.
ldconfig -v
/usr/local/lib:
(途中省略)
libboost_date_time-gcc41-mt-1_34_1.so.1.34.1 -> libboost_date_time-gcc41-mt.so
libboost_date_time-gcc41-1_34_1.so.1.34.1 -> libboost_date_time-gcc41.so
となっているので,ライブラリ自体は認識していると思います.
今気づいたのですが
checking whether the Boost::DateTime library is available... yes
ということはライブラリ自体は認識しているようですね...
checking for main in -lboost_date_time... no
と成っています-lboost_date_timeがおかしいということでしょうか...
>>300 yum install boostってやるときちんと./configureできてビルドできるのですが,今回は
boost::filesystemとか使いたいのでbjamつかって自前でビルドしてインストールしました.
boostって、どうしても使わないと駄目なのですか? 会社の先輩が boost、boost と boost 自慢して煩いのですが。
最近のコンパイラのみ使うのであれば、 使わなきゃ損。 使えない奴は低能。
boost無かったらC++使いたくない
boost も使えなかったら一人前とは言えない。
boostが無いC++なんかただの欠陥言語
TR1でいいじゃん
filesystemで相対パスを絶対パスに変換する方法があると Lets boostで書いてあったのですが、具体的にどうやれば 良いのでしょうか?
current_path()で得たもので./を置換したらどうだろうか?
アクセスできるなら相対パスでも絶対パスでもいいと思うが。 絶対パスである必要はあるの?
別のAPIの関数に渡すためとか
>>310 Letsだと変換が用意されてるように書かれてましたが、
自前変換しかないんですかねぇ。
仮に自前で処理するとなると、 ./ で始まってる場合、 ../ の場合、何も付いてない場合、ドライブレターの場合(最初から絶対パス)、 さらに/が\な場合など、かなり面倒な・・・
complete() とか、 system_complete() で簡単に変換できると思うが。
soreda
>>303 だってC++の標準ライブラリが貧弱すぎて話にならないから。
簡単なところでは正規表現とかshared_ptrとか。
bindとmem_fnもC++標準のよりBoostのほうが使いやすい。
>>318 どうでもよくね?
プログラム全体から見ると、Boostで楽になる部分なんて 1% 以下でしょ。
使いにくかったら存在価値ないもんな
shared_ptr で楽になる部分はもの凄く大きいぞw
>>321 あれって、参照カウンタで管理してるんでしょ?
循環参照したらオワタになるので、素人に使わすと逆に危ないよ。
そもそも、new するシチュエーションってそうそうあるか?
なるべく new を避けて書くのが C++er の嗜みだとおもうが。
new しないでまともにオブジェクト指向プログラミングできるかよ。 デザインパターンの半分は使えなくなるんじゃね。
C++標準ライブラリが貧弱だとは思わないけど もの足りないと思うひとがBoost使ってることが多いだろうね 数万行のコード書いたら1%ってめっちゃでかいと思うんだ (実際は1%どころじゃないけど)
循環参照が必要になる時点で大体設計おかしいんだけど、 まあ素人に使わせるとそうなることはあるかもしれんな。
>>323 殆どのインスタンスは、自分の親クラスのメンバ変数として一緒に確保されるから、
大きな new delete が時たまあるだけってのが普通じゃない?
細かい単位で new delete 繰り返すなんてのは、C++ には似合わないと思うが。
そういうふうに書いてくれ、と頼まれたなら仕方ないが。
Boostを使える(に理解のある)会社を紹介してください><
プログラミングで難しいのって、エラー時の例外処理だったり、パフォーマンスのチューニングだったり、 デバッグだったり、プロジェクトの管理だったりだよね。 Boostってあんまどうでもよくない ?
>>328 よくない
プログラミングで難しいのには「大量のコードを書くこと」や「難しい処理を実装すること」
は当然あるだろ
だったらコード量が減って、難しい処理を(Boost使わないよりは)簡単に実装できるなら使ったほうがいいんじゃない
>>330 >プログラミングで難しいのには「大量のコードを書くこと」や「難しい処理を実装すること」
>は当然あるだろ
えーーーー
無いなぁ。難しい処理ってのは、確かに難しいんだけど、
Boost 使ったぐらいでどうこうなるレベルの処理を、普通は難しいとは言わないよなぁ。
Boostって、「うっかりミスが防げるかもね!!」 レベルの話でしょ。
Boostを使うと、面倒くさかったことが簡単にできることはよくある。 しかし、難しい処理の実装は、Boostを使ってもやっぱり難しいよ。
Boostのメリットってなんだろうなと改めて考えちゃったが、
>>332 が非常に簡潔な答えをくれた。
「面倒くさい」
>>303 ×どうしても使わないと駄目
○メリット大きい・デメリットやリスクが少ないなら使う
まあBoostに限らないけど。
使いこなせる人間がわずかしかいないプロジェクトに導入したりするのはまずいかと。
新しいものを覚えるコストはゼロじゃないよ。
(誰か1人が使うだけで話が完結するならいいかもしれんが)
まあ、各人がBoostを使えた方が開発効率がよいとは思う。
気長に導入しようって話ならいいんでは?
boost使ったからって2倍も3倍も生産効率があがるわけじゃないしなぁ
3倍効率が上がらないライブラリは導入しません。
だいたい、ライブラリって何かに特化しているから丸投げで来て便利なわけだよな。 でも、Boostって何かに特化しているってわけでもないんだよな。 だから使ったところで丸投げできないし、結局あんまブーストしない。
STLを使うのと同じ理由じゃいかんのかな。
Boostはもう便利と言うより無いと不自然なライブラリになってる 効率上げると言うより無いと効率下がる いまさらshared_ptrもfunctionもutilityもoperatorsもcstdintも無しで済ませるのは苦痛だ
>>326 超頻出の Strategy パターンとか、大体 new が必要になるよね。
必要ない事もありはするけど。
shared_ptr や ptr_container があるだけで、メモリ管理がだいぶ楽になる。
ptr_list に delete してほしくないポインタを渡すことはできますか?
boostを使わないって? 使いこなせる人間がわずかしかいないって?(勉強はしないの?) こういうことだから日本のIT産業は
>勉強はしないの? 勉強する香具師は少数派
>>341 ptr_container系はデストラクト時に必ず要素をdeleteする。
嫌ならデストラクト前にdeleteしてほしくないメンバをコンテナから削除しないと駄目。
業務系はboostを勉強する暇があったら資格取れって話になるからな。 資格さえあれば仕事もついてくるって構図だから仕方ないけど。
>>340 普通メンバ変数として確保しておいて、切り替え時にインターフェイス用のポインタを切り替えるだけだな。
いちいち new するとかタコすぎる
まあ、そうやるときもあるけども、 new した方がいい時も多い。
>>339 なんかさ、開発効率って、結局そういうところで決まらなくね?
むしろ、
>>328 のようなことの方が影響大きいと思うのだが。
だいたい、メモリ管理なんてそんなに面倒か? メモリリークなんて、リソースリークも含めてここ数年出したことねぇなぁ。 設計がおかしいんじゃね?
自分の世界しか見えてない人多すぎ
面倒だからjava、C#はGCを実装したんだろ
GCは便利だね。だけどあれはメモリコンパクションあってのものだと思うよ。 メモリコンパクション無しで、しかも参照カウンタで管理だなんて、存在価値なくね ?
Boostを知らない者はC++を知らない (自明) C++を知らない者はCを知らない (templateはマクロでvirtualは関数ポインタだった) Cを知らない者はプログラミングを知らない (自明) 対偶を取ろう プログラミングを知る者はBoostを知っている
ど頭から真理でないやんけ
たしかに、templateはマクロで仮想関数は関数ポインタだが、 だからといって、どうして、「C++を知らない者はCを知らない」ということになるんだ? 普通逆だろ。 「C++のtemplateと仮想関数は、元々はCのマクロと関数ポインタであるので、 C++の元となったCを理解していないと、C++を理解したということにならない。」 となるのが普通だろ。 (自明)とか使ってる時点で釣りなんだろうが。
>>355 乙
危うく納得するところだった。
こういう詭弁はなんと命名されているのだろうか?個別性質と集合抱合のすり替え?
要はこういうこと。 偽: 「C があったから C++ が生まれた。」 真: 「C++ が生まれたのは、C があったから。」 C++の基礎としてCがあるのであって、Cの拡張としてC++があるというわけではない。 「Cの拡張としてC++がある」というのは一見正しそうだが、単なる結果論に過ぎない。 マンガの見すぎ、精神論、文系脳。 ただ単に、「C++の基礎としてCがある」という事実があるだけ。 これがロジカルな思考、現実、理系脳。
>>359 論理学・集合論的に説明してくれないと.....。
>C++ が生まれたのは、C があったから。 表現を簡単にしすぎて誤解しやすい表現になってる気が。
>>359 どう見ても「理系」の推論方法ではないな。そもそも「理系」という言葉を使う時点でアウトだ。
>>355 は一種のジョークだ。
C++ is not PreProcessor = C++(cpp)
とりあえずD&Eでも読んでみるか
Object-Perlとか Object-COBOLとか そりゃもう悲惨だからな
322の言うとおりならc++なんぞ使わずにcでいいじゃねぇかと思う今日この頃 newの無いc++なんざcとかわらん
>>367 scoped_ptr ってあれ一体何に使うの?
スコープはずれたら解放するってんなら、初めからスタックの上に確保すりゃいいんじゃね ?
それともマルチスレッド対策 ?
>>366 逆に C++ で new とか使いまくるぐらいなら、C++ なんぞ使わずに Java 使えばいいのにと思う。
>>368 new したポインタを返すような関数から返されてきたポインタを受けるときとか。
>>369 placement new を使った効率的なメモリ管理を選択する事もできるから、
C++ には C++ なりの利点がある。
>>370 >new したポインタを返すような関数から返されてきたポインタを受けるときとか。
C++ でそんなことするやつ居るのか。
素直に Java 使えよ。
>placement new を使った効率的なメモリ管理を選択する事もできるから、
placement new と smart_ptr って相性悪くね ?
>>370 >new したポインタを返すような関数から返されてきたポインタを受けるときとか
それはどちらかというとauto_ptrだと思う。
scoped_ptrはswapはできるけど(auto_ptr的な意味での)releaseができないから、
呼び出し側が他の方法でdelete管理をしたい時困る。
>>368 pimplとかfactoryパターンの生成物とか。
さっきから同一人物っぽいが、なんでポインタの扱い方がどうこう程度でJavaに乗り換えなきゃならんのだ。 その程度の理由で乗り換えないし乗り換えられない状況だって腐るほどあるだろうに。
C++ 使わずに C 使えば ? って言われたから、じゃぁ Java 使えば ? って言い返しただけだよ。
とりあえずJavaはNGワードの方向で
>>373 auto_ptr は次期 C++ で deprecated になります。
PCベースの人と組み込み(寄り)の人じゃメモリに関する認識が ぜんぜん違うから、どこまでいっても平行線
Java はデストラクタがないから リソース管理が面倒。
>>377 うまくいけば代わりにunique_ptrが入る。
unique_ptrってauto_ptrで削除子を決めれるようになっただけ?
move への対応が一番大きい進歩ではないかと
Deleter 指定可 explicit operator bool() 装備 代入でmoveはできず、std::move()が必要 こんなとこだっけ? まあ似たようなもの2つあると初心者は混乱しそうだが
boost::ptr_list<Hoge> a, b; があったとして、 b の内容全てを a の後ろに移動したいのですが、 そういうことはできますか? 出来る限り簡単な方法で。
よくわからないけど std::copy とか使えないのかな
一応1つの方法として
常に false を返す比較関数を使って merge する方法は思いつきましたが、
何かエレガントじゃないというか・・・。
>>385 コピーじゃなくて移動なんです。
a の最後に b の要素を付け加えて b は空にしてしまう、という形ですが、
内部的には単なるノードのつけかえで実現されるのがベストです。
splice
ptr_list には splice がないようですが、 代わりに transfer というのがありました。 ありがとうございました。
____ |← reject| boostの中の人 singleton ユーザー . ̄.|| ̄ ̄ ┗(^o^ )┳(`Д´)┳(^o^ )┛≡=- || ┏┗ ┗┗ ┏┗ ≡=-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
嫌がってるじゃないかw
boost には配列サイズを取得するマクロとかないんですか?
そんな気もしてましたが、やっぱりそうなのですか・・・。
>>392 Boost.Preprocessorにそんなようなマクロがあったような気が・・・
boost::rangeにあるsize関数ならコンパイル時決定ではないが簡潔。
397 :
デフォルトの名無しさん :2008/01/22(火) 05:22:38
シングルトン「うはwwwboostなんつー変態ライブラリ入りなんて死んでもお断りwwwwww 一生孤独でおkwwwwwwシングルトンだけにwww」 俺「\(^o^)/」
単純なデザインパターンだけど実装はいろいろあって大変なのかな
>>399 完全な、あるいは既知の欠陥がないSingletonライブラリを実装するのはほとんど不可能ってレベルで。
大体BoostでSingletonが蹴られたのってこれで何度目だ?
boostはsseに対応していますか?
Singletonは言語レベルで実装してくれないと苦しい部分が多いと思う。
404 :
デフォルトの名無しさん :2008/01/22(火) 12:30:29
提案としては悪くないんだけど、 何でもぶちこみすぎているから分解を検討しましょうってことだよね。
プロパティにブレークポイント置けるだけで グローバル変数よりは随分マシだけどね。
最近lambda使い出したモノです。 struct Foo { int var; }; vector<Foo*> vData; ...vDataの中身をいろいろ埋める sort(vData.begin(), vData.end(), _1->var < _2->var); ←コンパイルエラー これって実現方法あります? これ以上複雑に書かないとだめなら普通に述語書いたほうがいいような気がする・・・ vectorがFooのポインタなのは実装上の理由です。
bind(&Foo::var, _1) < bind(&Foo::var, _2)か_1->*&Foo::var < _2->*&Foo::var
Operators that cannot be overloaded Some operators cannot be overloaded at all (::, ., .*). For some operators, the requirements on return types prevent them to be overloaded to create lambda functors. These operators are ->., ->, new, new[], delete, delete[] and ?: (the conditional operator).
>206 今更ながらいただきました。thx! 自力コンパイルする前にこのスレ覗いてよかった。
>>410 どういたしまして.ただビルドしておいてるだけですが.
同僚から ICU 対応は?とか,もっとアップデートしろ
とか突き上げ食らってまして,そのうちまた新しいもの
置いておきます.
>>411 私も今いただきました。
私もスタティックだけを使うのでありがたいです。
/MT /MTd で作成されているのですよね!?
>>412-413 説明不足ですみません.
>>207 はそこに置いてある他のライブラリ(gmp とか mpfr とか)
で特に記述のないものは /MD, /MDd でコンパイルしています
ということで,boost に限って言えば bjam が /MT /MTd /MD /MDd
のすべてに関してビルドしてくれます.さらにオートリンクにより
適切なものが選ばれます.詳しくは boost/config/auto_link.hpp
を見てください.
余談ですが,自分がデフォルトを /MD /MDd にしている理由は
マネージドと混在させたい場合が時々あるからです.
/MT /MTd でコンパイルしたコードはマネージドと混在できません.
415 :
411 :2008/01/29(火) 07:50:47
Boost のバイナリだけ独立したページにしました.
http://svn.windy.cx/ から辿ってください.
あと,直リンクしやすいようにダウンロードを PHP 経由ではなくしました.
別にダウンロードされた回数とかカウントする必要ないので.
何かおかしいところがあったらここか上のWikiのコメント欄にでも.
boost.guid ってどうなったんだっけ?
実装にセキュリティ上の問題があるとかで、見送られたんじゃなかったっけ。 Windowsだと、簡単に世界で一意なGUID生成できるので、 Windowsでしかプログラミングしない自分としては、あんまりいらないな。
あれってWindows以外もあるヘテロな環境でもOKなの?
urn:uuid なんかの RFC を読むと GUID じゃなくて UUID って名称を使ってるんだよね.名称をどっちにするか っていう話も出てた気がする. あとは生成アルゴリズムがMicrosoftのそれと同じなのか どうかとか.同じじゃないとして何か問題起きないの?とか.
uuidgen くらい Windows 以外にもあるだっしょ?
ひとつの環境でしか動かないならそもそもBoostイラネ WindowsならクソみたいなMFC使ってればいいじゃん
>>421 誰もWindows限定で話なんてしてないじゃん.
そうじゃなくて,セキュリティ上の考慮
(この場合は衝突がどれくらいの確率で起きるか)
をしたポータブルな実装が必要だって話でしょ?
なんでMFCの話なん過去のスレッドで出すかなぁ.
< なんでMFCなんて過去の遺物をBoostスレッドで出すかなぁ. と補完しました
singleton は無事 reject されましたとさ。
無事ってひどいなw
426 :
デフォルトの名無しさん :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以外の数値を合計する方法を教えてください。
>>420 使われてますね,結構いろんな場所で.
たとえば Subversion ではリポジトリの識別に
UUIDが使われています.working copy で
svn info とすれば UUID がわかります.
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してやらんといけないのですが、 親クラスのキャストはいちいちやりたくないです。 これってこういうものなのでしょうか?
>>428 SuperFoo* と boost::shared_ptr<Foo> は暗黙の変換のない無関係な型でしょ。
DoSomething2(shared_ptr<Foo>(new Foo)); はOK。
>>429 最後の1行間違ってました。
DoSomething2(shared_ptr<Foo>(new Foo));でエラーになるということです…。
#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だがエラーなんて起こらないぞ
>>431 すみません自分が間違ってました。
void DoSomething2(shared_ptr<SuperFoo> p);
ではなくて
void DoSomething2(shared_ptr<SuperFoo> &p);
だったのがまずかったようです。
参照をやめたら通るようになりました。
豆知識 非constな参照引数に一時オブジェクトは渡せない
さらに豆知識 VisualCに限り可能だったりする
もうひとつ豆知識 関数の呼び出し式でスマートポインタを構築すべきでない DoSomething3(shared_ptr<Foo>(new Foo), bar()); だと引数の評価順序は不定なのでnew Foo→bar()で例外送出→shared_ptr構築されず→メモリリークになる可能性がある
そういえばそうだったな 引数の評価順序が不貞とか直感に反するふざけた仕様だよな
&& か || をオーバーロードして引数の評価順序をちゃんと常識的な社会の貞操ルールに従えさせるものでもつくりませう
コンマ演算子も評価順序決まってるから それ使うのが一番いいと思うぜ。
boost::chastityfunction, func, a, b, c, d, ・・・・・
>>433 それ常識じゃないですか
>>434 警告レベル上げると非標準と出せることは
サッターがGotWでも言ってますよ
警告は所詮コンパイル通るし
VC2005 で STL,Boost をスタティックリンクして .DLL を作ることはできるでしょうか?
STL はテンプレートライブラリだからリンクなんて不要 Boost もテンプレートのみの範囲なら同様。
boostConって何やるの? BoostCon Call for Sessionsとかメール流れてるけど
446 :
443 :2008/02/03(日) 17:26:04
>444 ありがとうございます。 STL は無条件で問題ないんですね。 Boost でライブラリを使ってスタティックリンクをして .DLL は作成可能でしょうか?
というかboostのDLL版なんて使うことあるのか?
448 :
443 :2008/02/03(日) 18:47:55
>>447 Boost をスタティックリンクした 自作DLLを作りたいんですが。。。
>447 TestUnitやRegexなど一部で必要。 でもxpressiveみたいな代替案もあるので、普通に使っている限りは要らないと思う。
>>449 そういう場合でもWindowsだと普通はスタティックリンク版使うだろうってこと。
その辺の制御するマクロもなんかあった気がするが。
451 :
443 :2008/02/03(日) 19:34:03
Boost は普段スタティックリンクしています。 .DLL は消していますので。 それをスタティックリンクして、自作のプログラムの .DLL をつくれるのかなぁと思ったもので;;; 1本の .exe が大きくなりすぎて、機能ごとに .DLL にしないと、Debug Build のブラウザ情報の書きだしに 時間が掛かって待ちきれないので;
適当なDLLプロジェクト作ってBoost使うコード書いてコンパイルすればわかる事なのに、 なぜ試さないのか。
453 :
443 :2008/02/03(日) 21:37:15
すみません、先輩方に聞いた方が確かだと思ったので; 実験するだけでも難しかしいなぁと思って; できるって教えて頂ければ何とか、チャレンジしたいと思います。
boost関係ないので初心者質問スレへでも行って下さい。 ここで粘着してもスルーされるだけですよ。
455 :
デフォルトの名無しさん :2008/02/07(木) 15:57:22
std::for_each の第三引数が参照で渡せたらなぁ と長い間思っていたのですが、 boost::ref というのは そういうときのためにあるのでしょうか? 内部状態を持ったまま幾つものコンテナをなめまわしたいとき, pred (←第三引数)を渡すといちいちコピーが発生するより 参照で渡したいなぁと.
うん
銀なら5枚、金なら1枚 ?
まちがえた
>>457 サイズによって違うよ、銀は三枚のこともあるよ
460 :
デフォルトの名無しさん :2008/02/07(木) 19:36:06
実際ブーストってどんくらいつかわれてんの?
boostのサイトとかにあったような
boost内のあっちとこっちで、全然違うだろうな。
progress_displayの悪口はそこまでだ あとspiritも
spiritはregexと同じぐらいお世話になってる
spirit「あるある」 regex「ねーよ」
xpressive「まあまあ」
compressed_pair「わたしのためにー けんかはやめてー」
boost svn最近更新少ないねー そろそろC++も終わりと考えていいのかな?
発想が飛躍しすぎではないか
更新ばっかされる不安定状態は本来よろしくない。 枯れないとC++標準として採用できないではないか。
C++0xで一儲けするぜ。
headのは1.35だけどバグだらけじゃん それでも更新が少ないって事はboostの開発者達は皆C++捨てて他の言語にいっちゃったって事じゃないのかなーとか思ったり
>472 の割にはレビューはそれなりに継続して行われてる気がするんだが。
>>472 更新少ないのかな?
svn見る限りでは2月に入ってリビジョンは64上がってるんだが
もしかしてCVSの方を見てるとか? boostの開発はsubversionに移行しててCVSの方は更新止まってるからね。
>>472 boosterの変態的嗜好を満足させる言語がほかにあるとは考えにくいがどうだろう。
就活でESに使ったライブラリにboostって書いたんだが聞かれたらどうしよう
つ boost::assert
SVNの1.35をVC++ 2008 EEでビルドしても、 Debug版が作られないのですが、こういうものなのでしょうか? コマンドラインはこうしています。 bjam -sTOOLS=msvc "-sBUILD=<runtime-build>release debug <runtime-link>dynamic <threading>multi" stage
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
自分は 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用のバイナリをおいてみました。
483 :
482 :2008/02/10(日) 12:44:35
ちょっとうそです。vc8 か vc9 をクリックするだけで 3つの *.cab ができます。ICU なしでビルドするように なってますので、必要なら適当にいじってください。 ためしにやってみたけど ICU 見つけてくれなかった(笑 まじめにやれ>俺
散々既出だったんですね、すみません。 DLL版があれば十分なので結局こうしました。 bjam --toolset=msvc-9.0 debug release --runtime-link=shared -- link=shared --threading=multi --without-python stage 2>&1 | tee h:\boost.log
みんなboostってどのくらい把握してる? ソースとか全部追ってるの? 謙遜とかなしに、みんなどれくらいboostを掘り下げてるか教えて欲しい。
MPLのソース見ようとして速攻で挫折した
リファレンスがないと何も書けない。 さすがにBindとかFunctionとか簡単なラムダ式はそらで書けるけど。
Spiritなら何回か世話になったからそこそこ。 Graph勉強しようとしたけどワカンネ
shared_ptrだけ世話になってる。あとはmem_fnをたまに。
490 :
デフォルトの名無しさん :2008/02/11(月) 01:16:27
rangeの存在意義がいまいちわからんぽ イテレータに比べてどんな事がうれしいんだろう 今のところ「イテレータより簡潔に書ける事がある」 位の理解しか出来てないっす
STLコンテナじゃないものにも使えるのが好きだな。 組込配列とか、イテレータのpairを即興で作ったりとか。 俺自身はサンプル見ただけだけど、CStringとかそっちもRange化できるし。
lexical_castとか小物はよく使う
optionalはお気に入り。
regex使われてないのかな?意外
regex面倒臭い。 xpressive使ってる。
xpressiveなんてのが増えてたのか。 regexとモロかぶってるw しかし、ライブラリのコンパイル不要なのと static regexが使える意外で、regexと何か 大きな違いがあるのだろうか?
速い(静的な意味で)
regexと比べて全体的に速い リンク不要といっても演算子によってフル展開されるから 総コンパイル時間は長くなる
>496 再帰処理が可能なのも大きい。 普通の正規表現では対応できない入れ子表現なんかも処理できる。
あの、なんでこのコードで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のやつを呼びたい。 }
>>497-499 なるほど。staticなら早いだろうなってのは
予想してたけど、表記のネストも可能になるんだ。
boost.python python.numpy をこれから使いまくろうと思ってる
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って各種コンパイラ用のプリセットがある点以外はかなり貧弱にみえるけど そうでもないの?皆使ってる??
504 :
503 :2008/02/13(水) 00:07:56
ごめん上のコードは忘れて
保存して忘れた頃に晒すとかしないでね
>>500 boost/algorithm/string/find.hpp内でusing boost::algorithm::findしているのが原因
ってのはわかるけど
解決策は「どちらか一方だけを使う」ぐらいしか思いつかない
でもまぁ捨てるとしたらrange_exの方かな…
同じようなものにovenがあるし
505 :
500 :2008/02/13(水) 02:20:01
うわ本当だ。 boost名前空間へ引きづり出されているとは、知りませんでしたOTL。 問題のところは、std::findへ逃げました。
>>503 cmakeとどっちが便利なんだろう
cmakeはドキュメントそろってるけどbjamにはない
autotoolsじゃないと使いたくない
scons
509 :
デフォルトの名無しさん :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
と言うエラーが出て先に進めません。
根本的に何か間違っているのでしょうか?
仕方ないので今は渋々インクルードファイルだけを使っていますが・・・。
510 :
デフォルトの名無しさん :2008/02/17(日) 21:22:54
すいません。環境書き忘れました。 Visual C++6.0でWindows XPで動作させています。
vc6だと使えないのが多い罠
ユーザ名くらい隠そうよ
513 :
デフォルトの名無しさん :2008/02/17(日) 21:43:10
>512 しまった・・・・まあいいや、本名じゃないし。
514 :
デフォルトの名無しさん :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は領域外だと例外投げるとかをのぞいて)
515 :
514 :2008/02/18(月) 02:26:57
すみません。vecstrにconst付けてました。サーセン。
>>514 それ以前に、trim(& vecstr[0])じゃないのか?
517 :
デフォルトの名無しさん :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の値がすぐ分かるように なっていますが、自分のプログラムではこの値はその関数内 でしか分かりません。
518 :
デフォルトの名無しさん :2008/02/18(月) 12:43:19
public: typedef boost::multi_array<double, 2> ; MyArray A; ある関数(){ int Arraylen Ararylen=3 A( boost::extents[4],[Arraylen]); } こうやってもダメでしたね。
519 :
デフォルトの名無しさん :2008/02/18(月) 12:46:13
>518 じゃなくて、こうしたらだめでしたね。
520 :
デフォルトの名無しさん :2008/02/18(月) 12:47:32
>518 間違えました。 typedef boost::multi_array<double, 2> MyArray ; です。
他にもつっこみどころが
522 :
デフォルトの名無しさん :2008/02/18(月) 14:36:49
>521 つっこんでよ。
523 :
デフォルトの名無しさん :2008/02/18(月) 14:40:21
>522 細かい文法 ;が無いとか以外に。 引数で渡したら二度手間だしなるべくやりたくありません。
524 :
デフォルトの名無しさん :2008/02/18(月) 16:02:41
ようするにAをPublic変数みたいな感じに 使えないかと。
525 :
デフォルトの名無しさん :2008/02/18(月) 16:50:14
public: int arraylen; typedef boost::multi_array<double, 2> MyArray; MyArray A( boost::extents[4][arraylen]); こうやってもだめですね。
526 :
デフォルトの名無しさん :2008/02/18(月) 16:53:00
>525 ちなみに、 class CxxDoc : public CDocumen { ...... 等は省略しています。
527 :
デフォルトの名無しさん :2008/02/18(月) 19:21:13
public: boost::multi_array<double, 2> MyArray; ある関数(){ int Arraylen; Ararylen=3; MyArray ( boost::extents[4],[Arraylen]); } これでもダメだったので、 public:: std::vector< boost::array<double,4> > MyArray; int Arraylen; Ararylen=3; MyArray.resize(Arraylen); } としました。 もっといいやり方があったらお願いします。
>>518 デフォルトコンストラクタで空のmulti_arrayを作っておいて、
関数内でmulti_array::resizeを使えばいいんじゃ?
public:
typedef boost::multi_array<double, 2>;
MyArray A;
ある関数() {
int Arraylen;
Ararylen=3;
A.resize(boost::extents[4],[Arraylen]);
}
529 :
デフォルトの名無しさん :2008/02/18(月) 22:17:38
>528 ああ、まさにそれです。 ありがとうございます。 boost自体をまだ勉強しないとダメですね。
530 :
デフォルトの名無しさん :2008/02/18(月) 22:33:30
VC6でboostのヘッダだけ入れてる状態で、boost::array等を使うと warningエラーが出ますが、正常に動いています。 気にしなくても大丈夫でしょうか? また、boostをきちんとビルドして入れると違いますか? ビルドがうまくいかないもので比較ができません・・・。
warningエラー
532 :
デフォルトの名無しさん :2008/02/18(月) 23:03:44
>532 VC2005EEか2008EE入れればすむ話なのでは
534 :
デフォルトの名無しさん :2008/02/18(月) 23:17:26
>533 NET Frameworkを入れたくないんです・・・。 一度入れたけど、すごくXPが重くなった。 それにバカだからMFCのAPPWizardが無いとちょっときつい。
535 :
デフォルトの名無しさん :2008/02/18(月) 23:42:38
>530 どうやらデスクトップでコマンドプロンプトを使うと、名前が長すぎるか、 それとも日本語に対応していないか?でうまくコンパイルができないみたい。 C:\にしたら問題有りませんでした。
>530は『VC6はC++じゃない』ということを理解すべき。 素直にVisual Studio Standard Edition 買った方がいいんじゃない? 2008にするかどうかは悩ましいところだけど。 わざわざ使い物にならないバッドノウハウの世界に突っ込むこともないと思う。
537 :
デフォルトの名無しさん :2008/02/19(火) 00:18:41
>536 わざわざ新しい物買うの? 欲しいのは山々だけどお金が・・・。 Enterprise買ったの失敗だったかな? MFCに捨てたらほとんどWin32APIの世界で やらないといけないようなイメージがあって 辛い。
>>537 VC6自体というかVC6のC++コンパイラな。だめなのは。
というか、コンパイラだけなら今のSDKのやつが使えないかね。
539 :
デフォルトの名無しさん :2008/02/19(火) 01:05:24
ExpressEditionならタダだろ
540 :
デフォルトの名無しさん :2008/02/19(火) 01:10:12
>538 そうですか? 失礼しました。 ところでlibsのなかにいろいろとできているのですが、ライブラリの拡張子が 何か教えてください。
541 :
デフォルトの名無しさん :2008/02/19(火) 01:11:38
>539 ExpressEditionでALTを使ってやっているんですかみなさん?
>537 自分から泥沼にはまるつもりなら止めはしないけど。 まあ、アップグレードでも2万円するしね。 そういや、前のバージョンならExpressEditionからもアップグレードできるのね。知らんかった。
543 :
デフォルトの名無しさん :2008/02/19(火) 01:17:49
なぜいきなりATL(だよな?)の話が
544 :
デフォルトの名無しさん :2008/02/19(火) 01:43:15
>542 NETFRAMEWORKいれるの覚悟でなんとかやってみる。 まずはフリーから。
ELTは良い曲だすよね
よくキーボードマニアでやったなぁ>ELT
MFCを捨ててWTLをやってみないか。
>>537 MFCのことはさっさと忘れろ
VC2005の無料版でboost+wxWidgetsで幸せになろうぜ
GUIはC#で書いて、マネージ/アンマネージ間をC++/CLIで橋渡しする。
GUIはguile-gtk
そういや、Boost GUI ってどうなったんだろ
Boost.Actもどこいったのやら
Boost で GUI ってまさか GUI Buider? 全然似合わないけど。
Boost 1.35ってどこで入手すればいいですか?
svn
>>549 C++/CLIだとC#からダイレクトに橋渡しするより楽なん?
橋渡しは、WinDNAの悲劇の再来。
>>556 クラスとかC++の機能を使ったライブラリが難なく取り込めたり、
<windows.h>ほか多数のヘッダが存在するから
関数プロトタイプをいちいち調べて書かなくてよかったりする。
Boostをsvnから取ってきて数日たったあとsvn更新するとけっこう変更ファイルあるみたいなんだけど、 みんなはどのタイミングのをビルドしてる?
自分が使うライブラリが更新された時。 あとは気が向いたら。 ビルドしたものは全部残しているから何か挙動がおかしければ 自分のプログラムのユニットテストで引っ掛かるからすぐ戻す。 いままで戻したことは無いけど。 ユニットテストは特にフレームワークを使っている訳じゃなくて 単にアサーションの連続だけど。
Boostの正規表現で(?<!)や(?<=)は使えますか?
regexでもxpressiveでも使えたはず。
boost のドキュメント見ればサポートしている表現は書いてあるだろ
565 :
デフォルトの名無しさん :2008/02/22(金) 01:34:09
enable_shared_from_this は1クラスしか対応してない? class MyName :public IClass ,public IName ,boost::enable_shared_from_this<IClass> ,boost::enable_shared_from_this<IName> { public: virtual boost::shared_ptr<IClass> get_class() { return shared_from_this(); } virtual boost::shared_ptr<IName> get_name() { return shared_from_this(); } };
エラーになる理由はpublic継承でないからに見えるけど、そもそも単にこうでいいと思う。 class MyName :public IClass ,public IName ,boost::enable_shared_from_this<MyName> { public: virtual boost::shared_ptr<IClass> get_class() { return shared_from_this(); } virtual boost::shared_ptr<IName> get_name() { return shared_from_this(); } }; T*からU*へ暗黙の変換が可能なら、shared_ptr<T>からshared_ptr<U>への暗黙の変換も可能。
って俺もpublicにしていないしorz
568 :
565 :2008/02/22(金) 02:09:54
コンパイルは通るけど実行すると bad_weak_ptr飛んでくる
まさかとは思うけど、shared_ptrに入れていないMyNameインスタンスに対して get_classやget_nameを呼んでいるなんてことはないよね?
570 :
565 :2008/02/22(金) 02:28:38
みんなBoost v1.35をsvnから取ってきて自前でコンパイルしてるのですか?
みんなって言われても俺一人じゃ答えられない(><)
最近あちこちでウザいアンケート多すぎ
ウザくてごめんなさい もう消えます・・・
最近同じやり取りが
>>559-560 でされてるから煽られても仕方ない。
消える必要までは感じないが、過去レスを見てから、死ぬがよい。
色々過去ログを見てきたので消えます。 皆さん達者で
boost::bindでstdcallな関数使う場合はBOOST_BIND_ENABLE_STDCALLを定義すればいいんだけど、 lambda::bindでstdcallな関数を使いたい場合は方法ってあるんでしょうか。 VC++2008です。 vector<ATL::CString> v; ってのを使ってて大文字小文字無視ソートがしたくて、 sort(v.begin(), v.end(), boost::lambda::bind(lstrcmpi, _1, _2) < 0); これだとエラー。cdeclなCRT関数使うと動く… sort(v.begin(), v.end(), boost::lambda::bind(_tcsicmp, _1, _2) < 0); もちろん大文字小文字を無視しないソートするだけなら sort(v.begin(), v.end(), _1 < _2); なんだけど…
boost::Poolライブラリ使ってる人いる? ちょっと使ってみたら、確かにデフォルトnew、deleteより 全然速かったんだけど、手放せないという人いる?
コピーすると自動的にディープコピーになる boost::scoped_ptr の変種って便利じゃね?
「ディープコピー」の振舞いを決めるのが難しい。 普通にコピーコンストラクタ組むのとあんまり手間変わらんし。
難しい?コピーコンストラクタを呼ぶだけじゃないか?
>>580 は要するに最大sizeが1のvectorだから、設計上の困難はなさそうだけど
深い構造体は同値性一つ取っても、
多種多様な意味付け方があるし、コピーだって同じだよ。
Lispみたいにメモリ管理については無視していい言語でさえ、
同値性は4つの述語関数がある。
>>581 はそういうこと言っていると思う。
まあどれか決め撃ちで作ったり、
テンプレートでコンパイル時に選べるのを作るのは面白いと思う。
>>583 その色んな意味付けから一つ選んでコピーコンストラクタの振る舞いを決めるのがC++のやりかたじゃないか?
実際にコピーを行う側は盲目的にコピーコンストラクタを呼んで、実際にどこまで深くコピーするかはコピーコンストラクタが決める
同様に、C++には標準的な同値性は二種類しかない
オブジェクトとしての同一性と、operator==
585 :
581 :2008/02/23(土) 18:59:10
>580 >584 むむむ?なんかハッキリしないなぁ 値の振舞いとの違いは何?boost::scoped_ptrに何を期待してるの?
optional使えよ
587 :
584 :2008/02/23(土) 19:05:26
>>585 俺は
>>580 じゃないよ
値との違いは、NULLになり得るとか、resetが使えるとか、コピーなしでswapできるとか、そんなんじゃね
588 :
581 :2008/02/23(土) 19:58:46
>587 その程度だと「boost::any使ってみたら?」でお仕舞いだなあ。 多態は使えんけど。
589 :
デフォルトの名無しさん :2008/02/23(土) 20:02:38
class A { ... scoped_ptr<B> p; ... }; A a; で,p の指している先のオブジェクトに dereference するには *(a->p) って書くと思うんですが。a->p まで書いていちいち 前に戻って *( って書くしかないですかね。 左から右に自然と書きたければ a->p.operator*() とか?
590 :
デフォルトの名無しさん :2008/02/23(土) 20:04:51
あ、ごめん、A a じゃなくて A *a と読みかえてください。
普通に最初から * ( と書き始めればいい。
なんで括弧使うの?
内部データの「ハンドル」を返え、 あ、いや、なんでもないです。。。
594 :
デフォルトの名無しさん :2008/02/23(土) 20:24:14
あれ?優先度間違って覚えてる?俺。
あっても無害だけど不要。
596 :
デフォルトの名無しさん :2008/02/23(土) 20:41:29
*a->p; だとまず * は a に作用するんだと思ってた。 先に -> が働いてから * が働くのか。
boostやるんだったら、暗記しなくてもいいから演算子の優先順位表くらいはすぐに出せるようにしておこうな。
分かってても俺なら括弧つけるね。
おれも括弧つけるね。 言語ごとに演算子の優先順位が違ったりするし。
他人が読む可能性のあるコードにはオレも括弧つけるな
俺もカッコつけたら動いたからつけてる
おまえらカッコばかりつけやがって
どうせコンパイラが最適化するんだから、ワークの変数にして短い変数で使う。
*a->bと*a++は定型句に近いと思うんだが
ここで*++aの出番だな
intrusive_ptr にはなぜ reset() が無いんだろう shared_ptr のノリで書いてるとついつい reset で代入しようとしてしまう
607 :
デフォルトの名無しさん :2008/02/24(日) 10:45:24
俺は reset できない scoped_ptr が欲しいのだが. 単に reset しなけりゃいいじゃんといわれればそれまでだけど.
resetのないインターフェースをscoped_ptrで実装
resetをprivateにして継承する
610 :
デフォルトの名無しさん :2008/02/24(日) 12:14:18
class A { std::scoped_ptr<X> pX; A : pX(new X) {} } もうね、コンストラクタの初期化リストで初期化した後は 一切触りたくないわけさ。ところで new X に失敗したら コンストラクタ中で throw std::bad_alloc() していい?
古いコンパイラでもなければ new が bad_alloc 投げるだろう。
>>610 pXをconstにすればresetできなくなる。swapもできなくなるけど。
613 :
デフォルトの名無しさん :2008/02/24(日) 12:49:57
>>612 そ、そうじゃん・・・
なんで今まで気づかなかったんだろ、俺。
boost.pythonはお題目だけであんまり開発進んでないのか 期待してたのに
C++からpythonのコードを呼び出す方の解説ページとかありますか? 逆は良く見るんだけど。。。
動的結合図書館
>>614 よく知らんけど、あれって汎用の言語ラッパとしては使えないんだっけ。
SWIGみたいな。でないとあまり Boost でやる意味ないような…
Python以外のスクリプトは死滅するから問題ない
619 :
デフォルトの名無しさん :2008/02/24(日) 20:30:51
個人的には JavaScript が好きなんだが・・・ だってプロトタイプが他の言語で C++ とずいぶん毛色が違うから. まぁ boost 関係なく Mozilla のつくってる JavaScript の エンジン使えばいいんだけどね.
Mozilla以外にも実装はいくらでもあるしな
ECMAScriptって言おうぜ
>617 Boost.LangBinding というプロジェクトがあるそうだが停滞してるみたいね。
あんなの粋狂でしょ。 そもそもboostはC++べったりだから。
べったりて 当たり前だろ
コンパイル時のC++の挙動にべったりなのに 他の言語でどうのこうの言う方がまぬけだよな
boost.pythonを有効活用している具体例or実体験を聞きたいです
boost.python の object, list, dict なんかのラッパクラスは結構便利
現状ただ単にCインターフェースにちょっとラッパ被せただけだよね。 まぁ便利なんだけどboostでやることかと聞かれると首を捻る。
>>615 pythonドキュメントのapi.pdf参照
boost::serializationを使ってXMLを出力してみたのですが 日本語を出力すると文字コードがすべてSJISになってしまっています。 しかし、XMLにはUTF-8との記述があり、正常なXMLにはなっていません。 内部ではwchar_t使っているので、できればUnicodeで処理したいのですが そのようにするにはどうしたらいいでしょうか?
woarchive使ったらとりあえず、全部UTF-8で処理してくれたので それでいろいろやってみます。
ありがとうございます。 見て回ります。
コンパイラの対応表ってどこでしたっけ?
さんくす
(1, 2, 3, ... n) n個の要素を受け取るシーケンス (1, 2, 3, ... n)(1, 2, 3, ... n)(1, 2, 3, ... n) ... (1, 2, 3, ... n) ってないの?作って良い?
638 :
デフォルトの名無しさん :2008/03/02(日) 04:53:34
boost使用時のMakefileの書き方について教えて下さい。 ----------------------- //t00.cpp #include<iostream> using namespace std; #include <boost/numeric/ublas/matrix.hpp> using namespace boost::numeric::ublas; int main() { matrix<int> mat0(2,2); for(int i=0; i<2; ++i){ for(int j=0; j<2; ++j){ mat0(i,j)=0; } } return 0; } ----------------------- をコンパイルするためのMakefileを以下のように書いたのですが、 うまく行きません。
639 :
デフォルトの名無しさん :2008/03/02(日) 04:54:10
続き ----------------------- CC = g++ OBJS = ./t00.o OPTION = -I/home/hoge/usr/include/boost-1_34_1/ #OPTION = PROGRAM = ./t00 .cpp.o : $(CC) -Wall -g -c $< -o $@ $(PROGRAM) : $(OBJS) $(CC) $(OBJS) -o $(PROGRAM) $(OPTION) clean : rm -f $(OBJS) ----------------------- boostは、/home/hoge/usr にインストールしました。 gcc バージョン 4.2.2 を使用しています。 g++ t00.cpp -o t00 -I /home/hoge/usr/include/boost-1_34_1/ でコンパイルできたので、同じようにMakefileに書いたつもりなのですが・・・ 宜しくお願いします。
>>639 なんで、どう「うまくいかない」のか書かないの?
何かの実験? 挑戦? 出題? エスパーの発掘?
boost関係なくね
>>626 Civilization4っていうゲームが、boost.python使ってた。
(インストールフォルダに、boost_python-vc71-mt-1_32.dllっていう見覚えのあるDLLが…)
Pythonでキャラクターの動きやUIの一部を書き換えられるようになってて、おかげでユーザーコミュニティが作った拡張が盛り上がってる。
一部は公式の拡張パックに取り入れられたり。
Pythonのおかげというよりは、ユーザーのいじれる部分をうまく切り出してる設計がよかったんだろうけど。
C++のソースも少しだけ公開されてたんだが特にboostばりばりって感じでもなかったな。
どちらかというと昔から見るような大クラス主義のC++。
>642 ソースみたいです。 インターネットで公開しているんですか?
>>642 そういう使い方もできるのか
組み込みというとLuaしか思い浮かばなかったがちょっと調べてみる
645 :
643 :2008/03/02(日) 12:45:47
646 :
デフォルトの名無しさん :2008/03/02(日) 13:55:31
>>638 です。
>>640 言葉足らずですみませんでした。
コンパイルがうまく行きません。
make時のエラーは以下の通りです。
g++ -Wall -g -c t00.cpp -o t00.o
t00.cpp:4:43: error: boost/numeric/ublas/matrix.hpp: そのようなファイルやディレ クトリはありません
t00.cpp:5: error: 'boost' has not been declared
t00.cpp:5: error: 'ublas' is not a namespace-name
t00.cpp:5: error: expected namespace-name before ';' token
t00.cpp: In function 'int main()':
t00.cpp:9: error: 'matrix' was not declared in this scope
t00.cpp:9: error: expected primary-expression before 'int'
t00.cpp:9: error: expected `;' before 'int'
t00.cpp:12: error: 'mat0' was not declared in this scope
make: *** [t00.o] エラー 1
>>646 --
.cpp.o :
$(CC) -Wall -g -c $< -o $@
--
どう見ても、OPTION渡してないじゃん。
スレ違いだからこれ以上ここで質問するなよ。
>>678 ありがとうございました。
スレ違い申し訳ないです。
boost導入してみたんだけど、何か便利に使えないかと思って Windowsのコンテナ系コントロール(リストボックス、コンボボックス、 リストビュー類)用のイテレータを定義してみた。 MyListBox box; ... BOOST_FOREACH(MyCtrlItem<MyListBox>& e, box) { if(e.GetSel()) { ... } } こんな風に使えて、かつコントロールの種類に関係なく列挙・操作できる ようになったけど、こういう使い方ってアリなのかね?
ありだとは思うけど、MFCより便利になって気がしないw どうせなら、MFCを超える勢いで頼む。
>>651 自分としてはWTLの拡張クラスみたいなもの作って使ってるんでMFCは比較対象外だなぁ。
あとFileFind系とDropFiles系もイテレート可能にしてみた。これも割と便利かも。
STLSoft で、MFCSTL とか WINSTL とか ATLSTL とか公開してる。便利 www.stlsoft.org
FileFindはWinSTLがやっているな。
bjamに昔あったsTOOLSとかinstallというオプションはなくなったのですか?
バージョンが 2 になったから色々変わっている
BOOST_FOREACHのループ内で、要素が何番目なのか取り出す方法ってあるんでしょうか? 現在の要素のイテレータ名が取れるならdistance(begin, it)で得られるかと思うんですけども。
普通にforで良いんじゃね?
>>657 それはたいていforeachですべきでない
非効率なことをしようとしている信号
配列と外部のストレージ(ListBoxコントロール等)を同期させるのに、総嘗めするだけだが 一箇所だけインデックスが欲しい、ということはあるな。 ちなみにforeach.hpp読んでみたけどそれっぽいのが見付けられなかった。 range_iteratorかforeach_iteratorあたりが取り出せれば行けるのかな?
661 :
デフォルトの名無しさん :2008/03/03(月) 20:26:09
もうGUIまわりは C++/CLI にうつってしまいますた,俺.
C++/CLI使うくらいならC#使ってそこからC++で書いたDLLを
663 :
デフォルトの名無しさん :2008/03/03(月) 21:42:14
>>662 C++/CLIってC++のクラスライブラリって使えたっけ?
>>663 もちろん。そのためのC++/CLIだ。
ではなくて、C#の打ち間違いだよな。常考。
>>655 今はこんな感じ
bjam --toolset=msvc-8.0 --prefix=C:\Boost install
vc71&stlportでビルドしたけどめっさ苦労した
vc8&stlportでビルドしようと思ったけど挫折した
vc9(x64)でビルドしたけどうまく動くのかは謎
Boost.Buildにまかせっきりでビルドしたことない
GUIとか速度が必要ないなら処理なら便利な言語にswigで渡す boost.pythonはどうだ?
boost.n88basic とかあったら思わず採用してしまいそうだ
boost.cobol あったらコボラでも使える言語に! …ならんなw
boost.braif*ck
boost.cli C++/CLI用 type_traits - is_ref_typeとかadd_handleとか。 function, bind - デリゲートも関数オブジェクトとして使える。デリゲートに変換できる。
boost.unlambda欲しいな
boost.cplusplus
boost.haskell
boost.fortran スパコン向け
boost.yeild
boost.mathematica
boost.life
boost.boots
boost.boost
boost.worst
boost.virtual_machine
boost.jit
boost.dos
boost::end(
>>670 -) == this;
意外と人がいるのねw
692 :
デフォルトの名無しさん :2008/03/05(水) 11:08:53
ひとり
ふたなり
3P
boost.xmlが欲しいね。serializationではなく。 機能的にはlibxmlで足りているのだけど、標準化されて欲しい。
697 :
デフォルトの名無しさん :2008/03/05(水) 23:26:32
BGLでDOM操作とか。 みんなXMLの処理には何使ってんの? expatは使ってる? バリデーションとかには? スレ違いか。
>>697 俺は用途次第、としか言いようがないな。
例えばゲームの敵情報やマップ情報みたいに実行中不変でそれなりに量があるものはexpatでSAXだし、
プログラムのコンフィグみたいに実行中可変で保存の必要があるようなものは
expatでパースする簡単なDOMみたいな独自ライブラリを使ってる。
Xercesはなんか巨大すぎるんだよな。 文字型とか文字列型とかリスト型とか全部Xerces独自のだし。
boost.xml的なものが欲しいっていうのは激しく同意。
SAX的なものはexpatで十分に事足りるから、C++に親和性の高いDOM的なものが欲しい。 あとpull-parser。
現状DOMってどう見てもJava用に設計されました、って感じでC++の実装は無理矢理感が漂うし。
699 :
デフォルトの名無しさん :2008/03/06(木) 18:02:13
.NET の XmlReader とかににたやつ?
たいていUTF8で扱われるXMLはテンプレートでパラメタライズする必然性を感じない。 個人的にはspiritもテンプレートで提供しているから使いにくいと感じる。
なんで突然テンプレート?
俺の中ではspiritは神
神というか一生かかっても俺には作れない自信がある
俺なんか使うだけでも一苦労・・・
初めてspirit使った時は文字通り感動した 地獄の構文解析がこんな簡単に…
>>702 PCの時代で本当によかった、これがCPUタイム課金時代だったら涙目
その時代にあんな変態じみた expression template を受け付けるコンパイラはなかろうよ
708 :
デフォルトの名無しさん :2008/03/07(金) 11:01:24
xpressive ってこの一カ月くらい更新激しいね.
spirit大変すぎるだろ。 lemonとか使ったほうがずっと簡単。
boostの各ライブラリのthread safetyについてまとまった文書とかない? マルチスレッド環境でboost::random使いたいんだけど、 スレッドごとに用意するべきなのかな。
>>707 LISP(大文字w)のマクロで同じことやった人ならいるかも。
Common Lispのloopマクロは、2,30年前だと考えるとちょっと狂ってるね。 Templateは元々Cの変態記号的な演算子をオーバーロードできるから、 Common Lispだとread tableまで駆使しているのに相当するけど。
713 :
デフォルトの名無しさん :2008/03/09(日) 16:30:55
正規表現ライブラリなどは boost を便利に使わせてもらってます。 ところで boost python をインストールするためには何を 準備しておかなければならないのでしょうか? Linux だと apt-get とか yum でサクッと入るのでしょうけど、 Windows だとそもそも python 処理系をあらかじめ入れておかねば ならんのでしょうか?当たり前だろ!といわれるかもしれませんが、 Windows での python 処理系って cygwin のやつしか使ったことが ないもんで・・・
当たり前だろ!
>>714 おれも書こうとしたが、真剣に質問してたら悪いなと思って自重したんだ。
716 :
デフォルトの名無しさん :2008/03/09(日) 16:56:26
すまん!真剣だったんだが・・・ ActivePython とか日本のユーザー会のPythonとかもあって、 boost.python ビルドするのに相性のいいのはどれよ、 てかもしかしてヘッダだけでいいんかね? ってことを聞きたかったんだ!
cmakeでFindBoostすれば自動でインクルードパスみっけてくれるから
今ならそれこそLua使ったほうがいんでね?好みの問題か。 boost本家ではないがboost使ったluabindってのがある
おまいらのレベルになると、q2chwmをビルドするのも楽勝なんでしょ?
何それ?
WM用の2ちゃんねるブラウザです。 q2chというりなざう用ブラウザの派生版
なんでそれをここで
向こうでも言ったけど、凄腕だらけだと判断したから
WMと言われてもlightweight_mutex.hppくらいしか思いつかん
まぁ結論だけ言うとスレ違い死ねよってとこかな。
そんなこといわないで
そもそも何が難しいのか理解できん SSL周りで必要なファイルが多いだけでは
新妻さんありがとう
でも死ね
便利そうだね,新妻さんありがとう でも宣伝乙
733 :
デフォルトの名無しさん :2008/03/13(木) 04:43:04
新妻・・・ハァハァ
オマンコがオマンコを呼ぶ怒涛の展開
間違えた orz
おまいはガチで面白い
でも死ね
死なばもろとも
死なばもろとも…? C++とBoostのことか… C++とBoostのことかーーーっ!!!
いえ、valarrayとprogress_displayです
あとvector<bool>もだな
progress_displayなんて誰かorどっかの著名アプリで使ってるのか?
著名アプリで使われることが全てではないだろうて。 だからといってprogress_displayが使えるとかそういう話でもないがな。
(´;ω;`)ブワッ
なんでプログレスバーをそんなに叩くんだよ。
boost.pythonって単純な型の変数しか扱わない関数呼び出しをラップしてくれるだけだよね。 決してクラスまで面倒見てくれる訳じゃ無いよね?
(´;ω;`)おっおっううぇああぁああぅぅおぉぉおお
GUIでも使える位汎用性があればまだ使い道があったのに
(´;ω;`)おっおっううぇああぁああぅぅおぉぉおお
今のvector<bool>はいらない子だが C++0xならコンテナの要件を満たした実装ができそうなうな気がする。 スレ違ったすまん
( ^,_ゝ^)ニコッ
>>751 フサフサはdeque<bool>でいいと言ってるだろ。
どっかの外人開発者のブログで「vectorはいらない子、dequeを使おう」っていうデータが出てなかったか? あらゆるパフォーマンスでvectorよりも平均的に優れているdeque。
さすがにそれはないw
レガシーAPIとやりとりするのに必要
ずっとデキューだと思ってた。 デックと言われたとき軽くショック受けて3日ほど寝込んだわ。
deckとひっかけて、あえてそう読める綴りにしたんだよね。 でも/dek/と発音しなくちゃいけない決まりは無い
>>754 つい先日、どっかのスレにリンク貼られてたね。
でも「あらゆるパフォーマンスで」っていう話ではなく、
「皆が思っている以上にdequeが勝っている項目が多い(から、dequeを軽視するのはやめよう)」
という話だったかと。
「とりあえずvector使っとけばいいってもんじゃない」ぐらいの趣旨かと
>>760 「要素の連続性保証がいらないならdequeにしとけ〜」じゃなかった?
deque は間に挿入しないのであれば メモリの最確保が起こってもコピーが発生しないからな。 あれは凄い利点だと思う。
ギャップ付きベクタを一般化したような感じだよな
Stackなどの補助コンテナはデフォルトでdequeを使ってるという事実。
そりゃそうだろ 両端キューなんだからスタック・キューの実装に不向きなわけが無い
まあオーバースペック感はあるが。
dequeはランダムアクセスに弱いし、
vectorに比べるとメモリ効率も悪い。
>>763 間に挿入してもコピーは発生しない。
>>769 間に挿入してコピー発生しなかったらそれはリストなんだぜ。
deque の挿入で O(1) なのは両端の挿入だけ。
間に挿入してもコピーが発生しないようなdequeは書こうと思えば書けるのでは?
>753 横浜優勝スレの人? >757 P.J.Plaugerさんによると、デックかディーキュー(ディーイーキュー)と読めだそうな。
>>771 ランダムアクセスがかなり複雑になりそうな・・・。
ランダムアクセスと途中への挿入・削除を高速にしたい場合はどのコンテナを使ったらいいですか?
木構造を使えば全操作を O(log N) で行えるようにはできる。
裏を返せば、O(1) でできる操作がないってことだが。 まあ、サイズ取得くらいは O(1) で可能だけども。
std::map の operator[] はランダムアクセスとはちょっと違うよな・・・。
Boost 1.34.1のuBlasを使っています。 matrixの要素をすべて列挙したいのですがどのようにすればいいですか? できるだけシンプルな方法が知りたいです。
>>779 ublas::matrix<T> m;
for (std::size_t i = 0; i < m.size1(); ++i) {
for (std::size_t j = 0; j < m.size2(); ++j) {
m(i, j);
}
}
ありがとうございます。 やはりインデックスを使わないと無理でしょうか。 述語Pの成り立つ要素をカウントしたくて int c = std::count_if( [first, last] , P); みたく1行で書きたかったのですが。
783 :
782 :2008/03/16(日) 02:30:40
[first, last] じゃなくて [first, last) です。すみません
イテレータを作ればいじゃない
ありがとうございます。 イテレータを作ってみたら結果的には長くなってしまいましたが望み通り動きになりました。
>>769 間に挿入してもコピーは発生しない。
規格では、こんなこと言ってない。どこに挿入しようが
メモリのreallocationは起こりうるというふうに考えて
おかないといけない。
dequeのランダムアクセス (operator[]() とか at() とか) は 定数時間だったと記憶していたが、俺の記憶違いか?
dequeのランダムアクセスはO(1)じゃないなんて意見はでてないよ?
std::dequeはそうだね。 dequeはdouble ended queueのことだから、 deque一般には成立しない。
791 :
788 :2008/03/16(日) 10:34:28
あ、ほんとだ すまんこ
俺もstd::dequeの話だと思ってた
C++だとlistが、 double linked listで実装されたdequeにそのまま使えるから、 dequeの別の実装はないだろうね。 Javaはdequeはinterfaceで、 list版とarray版の両方の実装がある。
テキストエディタ作ってるんだけど、行管理クラスは各行へのランダムアクセスと 途中への挿入・削除処理の高速性が要求される std::deque はその両方の要求を満たしてるの?
>>794 途中への挿入・削除はノードベースコンテナ(std::list std::setなど)よりは遅い。
ランダムアクセスは、一般的にメモリの構造上vectorよりはアクセス速度は落ちる。
でも実害ないなら無視すればよろし。
各行へのランダムアクセスって、どういうときに使われるの? いきなり500行目にジャンプ!とかってあんましないような。 頻繁に行われるであろう検索・置換もシーケンシャルだし。
行数指定してジャンプは良く使わないか? コンパイルエラーを直すときとか
たしかにコンパイルエラー直すときは重宝するけど他にもあるかな? std::deque を使うとランダムアクセスは定数時間だけど、削除とかは線形時間。 例えば1万行のテキストの空行を全て削除、とかいう操作をやるともっさりしそう。(最悪で1万の2乗くらいのオーダー) std::list の方がいいのでは。
テキストエディタは、
・行指向エディタだと、行のダブル・リンクト・リスト
・ギャップ・バッファ
が古典的だね。
>>797 ギャップ・バッファ方式(e.g. Emacs)でもそんな遅くないでしょ。
こっちの方が改行コードを含めた正規表現検索とかやりやすいし。
STLコンテナの要件を満たすギャップバッファ式コンテナを作ったことがあったが なかなかいい勉強になった。
うp
検索するといくつかあるね ていうかboost関係ないな
Boostにもあればいいって話かな
>>800 俺も以前ショボイながら作ったけど、ギャップバッファの実装そのものより、
STLコンテナの要件を満たす条件を調べるのに費やした時間の方が長かったという・・・
既存のvectorとかdequeにあわせて戻り値やら関数やら作れば とりあえず問題なくね?
ContainerConceptが通れば問題ないよ
>>786 メモリの reallocation とコピーは別問題だよ。
>>790 deque のランダムアクセスは O(M) (M は内部バッファの分割数)。
O(N) よりははるかにマシだが、O(1) ではない。
>>807 何見てしゃべってんの?規格じゃないよね?
規格じゃない。 具体的に実装すると大抵の場合そうなっちゃうという話。
つまり特定の実装に依存する話なわけだ。 途中への挿入で複数要素のコピーが発生する実装も、 ランダムアクセスが O(1) な実装も、規格の範囲で在りうるんだから、 何の前提も書かずに言い切らないでほしい。
>>807 別問題じゃないよ。
std::dequeは、挿入・削除は対象以外の全てのリファレンス、ポインタ、イテレーター
を無効にする。リファレンスとポインタは先頭、末尾挿入の場合は有効のまま。
Josuttis本にはこう書いてある。
ということは、reallocationによって要素は移動されることもあるというわけでしょ。
これは初期化あるいは代入は発生しうると考えておくべきということ。
Josuttis本が間違いなら知らん。
配列をvectorに変えたら、コンパイラがsseを使わなくなったのだけど vectorってsse使ってくれないの? FC8+Intel v10です。
安全を考えると当然規格には従っておくべき。
スレ違いな話が続いたせいで迷子がでたようだ。
>>811 挿入・削除されたから無効になるんだろ。
reallocation が起こらなくても無効になるんだから、
reallocation とは無関係。
分かった分かった。 お前はO(N)なソートでも使ってろ。
>>807 ,809
deque のランダムアクセスは償却定数時間じゃないと規格の要件を満たさない。
「内部バッファの分割数」ってのがはっきりしないけど、「O(1) ではない」と言い切れて
しまうような実装は deque とは言えないんじゃないの?
>>815 挿入もしないのに勝手にreallocationされんの?
新しい要素のために領域が必要だからreallocationされるんじゃないの?
ランダムアクセスが償却定数ってどういうこと? 規格には定数って書いてあるよ
>>815 shrinkはされる可能性はあるが、reallocationは必要になったときのみだ。それは
必要な領域拡張のとき。要素の挿入もその可能性は常にある。だから関係はある。
>>817 ああ、よく考えたら定数で実装できそうだな。
>>819 あれ?そうなの?
"Table 68 - Optional sequence operations" に載ってて、こいつらみんなまとめて
償却定数時間だから、 deque の operator [] もそうだと思ったんだけど。
別のところに書いてあるのか?
長くなりそうなら、いいかげんにスレ移動してくれ。
厳密には 先頭と最後の要素へのアクセス速度は同じ。 それ以外には間接レベルが違うから差異があるよ。 Big O記法はよく知らんが、少なくともlogやn^2ではない。 Data Structure AND Algorithm In C++が分かりやすい。
>>818 >
>>815 端への追加は O(1) で行わないといけないので、
端への追加でメモリを最確保する必要があったとしても、
それまでのデータを新しいメモリにコピーするようなことは行えない。
データの全コピーは O(N) だから。
この場合、メモリの最確保が行われるが、コピーは発生しない。でしょ?
> 最確保 の検索結果 約 183 件...
>>827 端はわかるけど、中間への挿入はどう考えればよい?
コピーが発生しないなら、挿入時に挿入要素以外の全イテレータは無効になる理由が
わからん。
このカスどもはスレチな話をいつまで続ける気なんだ
>>829 中間への挿入はコピーが発生するに決まってるだろ。
てか、そんな神経質にならずに先ずは規格で言われてるように 使えばいいだろ。たいがい問題ない。 考えて見ればBoostスレじゃないか。おしまい。
>>832 でしょ。そのときは新しいメモリの割り当てもあり得るじゃん。
ウヒヒ。
>>834 内部で確保しておいたバッファを越えていなければ
メモリの割当は起きないだろ。
要するに、reallocation に原因があるのか それともコピーに原因があるのか、 それが分かっていない、とそう言ってる。 イテレータが失効するのはコピーが発生する可能性があるから。 reallocation がその時たまたま起こるかもしれないが、それは直接の原因じゃない。
ところで progress_display なんだが
断る
>>835 よく読んでね。
あり得るって書いてるでしょ。
boost::mutex てヘッダだけで完結しないんだな。 ライブラリをリンクするのめんどくさいし+デカくなるんだが。
Boost関係ないけど、C++の規格ってみんな何を参照してるんですか?
JIS のサイトでタダで見れる。
ANSI。安いし。
つーかJISが自由に見れないってどうなのよ ああいうものこそフリー・オープンであるべきなのに
維持には金がかかるんだよ! ってことだろう。 まあ、ネット上で見る分にはタダだから俺は気にはしてないが。 それよりも、金払って買っても C の規格書とか画像データの PDF で検索できないとかいう話らしい点は どうかと思う。
なんでこうスレ違いな話をここでやるんだ?
うっかり盛り上がってしまったから。 いいじゃないか、たまには。
ダメ。 2度も3度も誘導されておいて、移動しないのはアホ。 ふさわしい場で議論をしようという気がない腑抜け。
そんな議論なんてまじめなことやる気がないのは 移動しないあたりからよくわかる。 ちょっとおいたのすぎた雑談だよ。
ラベルも低いしな。
別に良いじゃん
っていうかなんでこの板はIDないの?
857 :
デフォルトの名無しさん :2008/03/19(水) 11:39:07
vc8, vc9 で boost.test のビルドに失敗するようになってしまったんだけど, なんか心当たりある?最近までビルドできていたので boost.test まわりで 最近何か変化があったか見てみたんだけど何もなかった.とりあえず bjam --builddir=builddir-vc9 --build-type=complete --toolset=msvc-9.0 --without-test stage 1>..\build.log みたいにして --without-test してビルドしてるけど,気持ち悪い.
858 :
デフォルトの名無しさん :2008/03/19(水) 11:48:26
bjam --builddir=builddir-vc9 --build-type=minimal --toolset=msvc-9.0 1>..\build.log ちなみにこんな風に --build-type=minimal (つまりデフォルト) だとビルドできる.なんかターゲットが重複しているとか・・ 正確なエラーメッセージを後で貼ります.
859 :
857 :2008/03/19(水) 11:55:12
860 :
857 :2008/03/19(水) 11:57:05
progress_displayでコレが簡単に作れるなら使ってもいいかもしれない _, ._ ( ・ω・) now shibakaring ... ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)WWWWWWWWWWWWWWWWWWWWWWW (26%)
cursesでも使っとけ
863 :
857 :2008/03/19(水) 12:59:28
864 :
857 :2008/03/19(水) 14:27:50
VERSION_1_35_0_RC1 ならすんなりビルドできるような気がする。 いままで trunk でもとらぶったこと無かったから RC のタグが打たれてたことに気づかなかった。
865 :
デフォルトの名無しさん :2008/03/19(水) 18:35:55
boostのrandomのライブラリでカイ二乗分布に従う確率変数を生成できますか?
866 :
865 :2008/03/19(水) 19:52:19
boostじゃないけど、ググってたら見つけられました。
867 :
857 :2008/03/19(水) 19:53:06
>>856 IDがあったところでプログラミング自体に有益な議論にはならないからだろ。
理数系板はID無し多いね。
リアルタイムで回答する場合、 質問者がだれか分かりやすいから ID 欲しいというときはある。
刈りたいのに生やしたら駄目だろ
boostのおかげで自作のプログラムのマクロ機能は Pythonで実現することに決定しました。
質問です。 Visual Studio 2005を用いて プロジェクトの種類を「CLR」、「Windows フォームアプリケーション」 として新規作成したフォームにボタンを一つ設置し、以下のソースを記述し、 vector<wstring> vec; vec.push_back(L"Hello"); double pi = 3; wofstream file(L"save.txt"); text_woarchive oa(file); oa << (const vector<wstring>& ) vec; oa << pi; 実行したところ、 oa << (const vector<wstring>& ) vec; の箇所で 「Debug Assertion Failed! Program:c\Documents and Settings\unchi65sai\archivetest\Debug\archivetest.exe File: dbgheap.c Line: 1473 Expression: _CrtIsVaildHeapPointer(pUserData) 」 とダイアログが表示されて停止してしまいます。 ちなみに、 oa << (const vector<wstring>& ) vec; の部分をコメント化すると、正常に処理が行われ、テキストファイルが生成されます。 この現象は、プロジェクトのプロパティを何か変更することで回避できるのでしょうか? あるいは、CLRでは、 stringの書き出しできないものなのでしょうか? よろしくお願いします。
スレ違い
>>874 C++/CLIでunmanagedなコードを混在させてboostを使うとそうなる。
アプリケーションのエントリポイントを次のようにすると直ると思う。
?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z
ちなみにこの問題はVS2008では直っているらしい。
877 :
874 :2008/03/20(木) 19:17:41
>>876 プロジェクトのプロパティを開き、
「構成プロパティ」→「リンカ」→「詳細」→「エントリポイント」
の設定を変更したところ、正常に機能するようになりました。
情報をありがとうございました。
Windows で boost python を使ったアプリケーションを書いています。 配布に際して boost python 自身の DLL は一緒に配布しなければ ならないのは当然として、Python バイナリパッケージ由来のファイル も何か配布しなければならないのでしょうか?
879 :
878 :2008/03/21(金) 14:00:43
Dependency Walker で調べてみたら、 C:\WINDOWS\system32\python25.dll も必要なようです。 しかし!驚愕の事実! python25.dll 自体が Visual C++ 7.1 のランタイムを要求している! 自分は Visual C++ 8 を使っているのです。異なるバージョンの ランタイムを要求する DLL たちをあわせて使っていいのかなぁ。 今までもサードパーティのライブラリをそういうこと気にせず 使ってたけど、動いていたし、まぁいいか。いいことにします。 作ってるアプリも売り物じゃないし。
ところで POCO 使ってる人いる?
Plain Old C Object?
プログラムがバグって動かなかったけど、なんとなくポインタを shared_ptr に変えてみたら動くようになった 好きになったぜ>ぶーすと
>>879 DLLというのはもともと、DLLを使う側に依存しないようになってるので、
DLL「A」とDLL「B」が違うランタイムを使っていてもぜんぜんOKです。
今回は例外として、普通はアプリからどのランタイムを使っているのかなんて分からないし、
気にするべきでもないと思います。
(考慮すべきことはマルチスレッドに対応してるかどうかくらい)
ランタイムが違えば、必要なDLLが増えるということはあるけど、
ランタイムが違うことで動かなくなることは多分無いです。
もし動かなかったら、それは別の問題が発生している可能性高し。
> Python バイナリパッケージ由来のファイル
> も何か配布しなければならないのでしょうか?
Pythonがインストールされている環境を前提にするならば配布する必要は無いです。
そうでないなら配布する必要があります。
>>884 ふむ、そうなのか。ミューテックスとかは
OSで管理するものだから問題ないんだな。
でもマルチスレッド考えるとなんか副作用が
ありそうなんで、暇なときに調べてみる
OSのAPIとCの標準ライブラリが分離されてるWindowsには好感が持てる
APIは分離しているけど 実装はMSVCRT.DLLなどに依存しているがね
std::sort(v.begin(), v.end(), _1->Func() > _2->Func()); みたいなことをlambdaやbindを使ってやる方法ありますか?
ごめん忘れて、よく見てなかった...
こういうこと? std::sort(v.begin(), v.end(), bind(&Class::Func, _1) > bind(&Class::Func, _2));
892 :
888 :2008/03/23(日) 01:31:52
>>885 OSうんぬんより、mutexは別スレッドからlock/unlock期間中のアクセスを待機させるから安全か
どうかとえば、使用は慎重を期するよ
別プロセスは関係ないが…
共有メモリやらメモリマップドファイルは別だけど
セマフォ、ミューテックスの使用は本当に必要であるかを加味した方が良さそうに思う
boost::thread::mutex(だっけ?) はでも便利だね
スコープから抜ければ勝手にデストラクタがunlockしてくれるのも楽でよい
自作してもauto変数なら当然かも試練、スマソw
>>886 悪の枢軸たるWindowsもそう考えると良いとこあるのかね
でもさ、結局printfなんかもさMSVCRT.dllなんかがラップしてんだよね
メイクファイルでビルドしようとしてリンクエラーで苦戦したことがよくあったなあ
>>888 >>891 が答え書いてるけど、bindは便利だよな!
STLスレでもやってたけど、ここはお前の雑談スレじゃないんだよ?
410 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/22(土) 20:51:00
なんで雑談してんの?
411 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/22(土) 23:17:29
相談が無いからだろう
相談できる雰囲気でもないがね
412 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/23(日) 00:44:28
何で雑談しているのかを聞く それも雑談なんじゃね?
自分の胸に聞くのがはえーんじゃね?
415 名前:オガちゃん萌え ◆tyvkWCNtzY [sage] 投稿日:2008/03/23(日) 20:37:34
>>410-412 まぁ固いこと言わないでマターリやろうよ
こんな事書く人間に何を言っても無駄かと
NGが得策
>>894-895 スレ違いってほど外れた話題はしてないつもりだが?
俺叩く暇あるなら、なんかboostについて書いてくれ
なんていうかもう糞コテ氏ねとしか
boostはもう無しで生きていけないけど、テンプレート使い過ぎて 時々コンパイラが音を上げるのが困る
>>898 STLスレで誰か書いていたが、EffectiveSTLにSTLのエラーは読むなってのがあって、実際に本棚に
埋もれたEffectiveSTL読んだらconstキャスト忘れとかのエラーを理解しろみたいなのが書いてあったよ
SingletonとAbstractFactoryパターンをよく使うんだが、AbstractFactoryをテンプレートにして
中にmap<int, string>かなんかやったときにwarningが出まくったことあったw
それこそ、この内容はSTLか。
boost一番よく使うのはツールだな
tokenizer、regex、bindなんかはもう無しじゃ生きていけない
900 :
デフォルトの名無しさん :2008/03/24(月) 00:33:17
C++から基底クラスを公開してPythonでクラスを継承して実装、 C++からその実装されたクラスをnewしてPythonに渡す。 といったような事がやりたいんですが、boost.pythonで出来ますか? 参考書籍、およびサイトなども教えてもらえたらありがたいです。
できたらすごいな。 俺はPython使い始めたばっかりで一方向の使い方しかしてないけど興味ある。 できたら教えて欲しいな。
IronPythonならそのものズバリな事が簡単にできるんだがのぉ。
>>902 ドトネトは断る!
って、うそ。 C++/CLI は使ってるし。
とはいえ、非UNIXで動かしたいプログラムに
多いんだよな、Boost.Python 使いたくなるケース。
IronPython + mono でやれって?断る!
上のほうにも出てたがLua+LuaBindでも使ったほうがいいんじゃないか。 ランタイムDLL類不要になるし。
>>904 Lua + LuaBindとかSquirrel + SqPlusとかも考えましたが、
Boost.Pythonで無理ならSquirrelにするかな。
ランタイムDLLはオプションをdefineしてやればいらなくなると
どっかで読んだ覚えがあるんですが読み間違いですかね。
VS2005 で作っていたプログラムを VS2008でコンパイルしたら; Unknown compiler version - please run the configure tests and report the results と言うワーニングが Boost を使っているソースででました。 リンクも成功し、実行もできるのですが。。 このワーニングを消すにはどのようにしたらよいのでしょうか?
SVNのHEADを落として使う。 1.34.1がでたのは、VC9が出る前だ。
ここで、どなたかがUpしてくれた、1.35 の Build 済みを使ったのですが。。 ヘッダーは VC8,VC9 共通みたいでした。
何人かの人がバイナリを上げているみたいですが、そのうちの一人です。 boostのどのライブラリでワーニングが出ます?もう少し詳しい状況が分かると調べられるのですが。
その画像がどのスレッドに貼られていたのか分からないんだよな
>>907 おいらは906じゃないけど、SVN で落としたのに置き換えたらエラーがでなくなった
あんがと
最新版のヘッダーのみ落としてきていれたんですが、ワーニングは消えませんでした; コンパイル時に config/visualc.hpp 内のワーニングなので、ライブラリは関係なさそうなのですが。。
消えないって言うんだったら、 1.35の正式版が出るまで無視するってのは駄目か? どうせ実害はないんだし。
HEADは結構不安定。 まぁ自分の使いたいライブラリがうまく動いていればそれでよし。
ありがとうございます。正式版までワーニングは見ないことにします。
1.35.0キタ
917 :
デフォルトの名無しさん :2008/03/30(日) 12:05:34
>>916 News
* Version 1.35.0
New Libraries: Asio, Bimap, Circular Buffer, Function Types, Fusion, GIL, Interprocess, Intrusive, Math/Special Functions, Math/Statistical Distributions, MPI, System.
Updated Libraries: Graph, Hash, Iostreams, Multi Array, Multi-index Containers, Serialization, Thread, Wave, Xpressive.
March 29th, 2008 12:00 GMT
ひさしぶりのうpだけあって盛りだくさんだなぁ
相変わらずVC8.0最強なんですか
これでまたしばらくビルドできませんの質問が相次ぐんだろうか
Boost.InterprocessのWindowsの実装って貧弱じゃない? というかPOSIXを前提に設計されているようで、 Windowsだと素直に実装できないってのもあるのかな。
threadingやasyncなんかもそういうノリで作ってそうだから 敬遠してる
http://www.kmonos.net/alang/boost/build.html と本スレ参考にv1.35を
@vcvars32.bat実行
Abjam --toolset=msvc-9.0 stage
としたんですが、以下のように出てビルドできません。
何か足りないツールでもあるのでしょうか?
MkDir1 lib
'C:\DOCUME~1\????' ???A?????R?}???h???????O???R?}???h?A
???????\???v???O???????????o?b?` ?t?@?C?????????F?????????????????B
mkdir "lib"
...failed MkDir1 lib...
MkDir1 bin.v2
'C:\DOCUME~1\????' ???A?????R?}???h???????O???R?}???h?A
???????\???v???O???????????o?b?` ?t?@?C?????????F?????????????????B
mkdir "bin.v2"
...failed MkDir1 bin.v2...
...skipped bin.v2\libs for lack of bin.v2...
...skipped bin.v2\libs\test for lack of bin.v2\libs...
...skipped bin.v2\libs\test\build for lack of bin.v2\libs
以下たくさんskipped
一般論として、空白か非ASCII文字(ユーザ名)を含んだパスが悪さしている可能性はないか?
>>923 ユーザー名は確かに日本語ですわ。
で、多分"Documents and Settings"配下で何かしようと
してるんだと思うんだけどユーザーだけ切り替えればいけるかな。
やってみる。
@vcvars32.bat実行
Abjam --toolset=msvc-9.0 stage
の手順は一般的に問題ないっすよね?
やっぱりユーザー名だったみたい。 administratorに切り替えたらビルドできたような気がする。 dllとかlibがbin.v2っていうフォルダに出来てる。 ただ、 bjam --toolset=msvc-9.0 stage だと アップデートになってしもうた。 1.35で新たに追加されたAsioやら全てをビルドするためには 別のオプションがいる??
アップデートだとAsioとかビルドされていない?
>>926 1.34.1の既存のものはビルドされた(アップデート)んだけども
1.35.0で新しく追加されたものがビルドされてないみたい。
bjam --builddir=builddir-vc9 --build-type=complete --toolset=msvc-9.0 stage 2>&1 | tee c:\boost.log
でやってみたんだけど、static、dynamic(dll)の二つのバージョンが出来たこと以外
変わらんかった。
http://www.boost.org/doc/tools/jam/jam/usage.html には
bjam ( -option [value] | target ) *
でtargetを指定しなければ全てビルドされると書いてあるんだけどなあ。
>>922 bjamの最新版は日本語メッセージが文字化けして???になるよ。
>>928 ああそうなんだ。
とりあえず既存のものはビルドできるみたいだ。
release、debugとも出来てる。
asioとかがビルドできない。ビルド対象を指定するか
設定ファイルなんかが必要なんだろうか。
新しい機能のレビューお願いします
waveがイマイチ遅い
>>930 ホントだ。そうみたい。
もしかして1.35でライブラリ作成する必要のある新しいものって
無いのかも?
ソケットで遊んで見る。
ASIOとかWaveとか一瞬スレ間違えたかと思った
サウンドプログラミングかよ
>>933 新しいものの中ではsystemが要ビルド。
>>936 それならstage\libにライブラリできてるから成功してるっぽい。
938 :
デフォルトの名無しさん :2008/03/31(月) 01:02:35
しかし、bjamはいい加減、VC8以降はシングルスレッドビルドを無視、あるいはエラーを返すべきだと思うんだ。 自分で指定するのめんどくさい。
940 :
デフォルトの名無しさん :2008/04/01(火) 02:50:31
cとpython混合させたきゃpython.ctyes使え boost.pythonはpythonをcから呼びたい時だけ使うのがいい
sqliteをハンドリングするような関連コンポーネントってあるのかな
boost::propertyはC#みたいなプロパティー作れるものなの?
開発環境としてVS2005を使用し、 tokenizerを使用したプログラムをデバッグモードで実行したところ 超絶遅くて絶望したんですけど、これは回避できないですか?
リリースモードで実行
GCCだとboost.testやboost.optionalがテスト通らない Boostの中の人はM$信者なの??
>>945 信者どころか社員いるし
しかし、パスするテストを増やすのに必要なのは信者じゃなくて人柱と開発者だ
でもまだVC++2008はちゃんと対応してない。
spiritのセマンティックアクションにメンバ関数を渡したい場合、 どういう方法が良いでしょうか?
bindするもんなんじゃないの?
>>949 struct parse : public grammar<parse>
{
template <typename ScannerT>
struct definitionmy(parse const& self) {
//略
int_p[bind(&parse::func, self, _1)]; //bindでメンバを渡す
};
void func(const int val);
};
こういうことですか?
他の方法って無いのでしょうかね?
毎回bind書くのはしんどいんですが。
俺も最初bindしていたけど、たしかに面倒になってきて、 極力assign_aとかpushback_aとか定義済みのやつで済ませるようになった。 あと、そのfuncはconst付けないとエラーになるよ。
ところでboost1.35.0とbjam3.1.16-1で bjam --toolset=msvc-8.0 -sBZIP2_SOURCE=〜 -sZLIB_SOURCE=〜 --stagedir=. stage ってやってビルドしたら、なぜかreleaseビルドのマルチスレッドのlibファイルしかビルドされないんだが、こういう仕様に変わったの? 前はdebugとかも出てたよね?
>>952 試行錯誤の結果、こうすれば全部ビルドされた
bjam --toolset=msvc-9.0 stage release debug link=static,shared runtime-link=static,shared
BZIP2_SOURCEとかは事前にsetしてある
>>951 >funcはconst付けないとエラーになる
boost::functionに一旦入れてから使ったらエラーが出ずに
通っちゃったので気が付きませんでしたw
>>954 どうやったの?
俺も今Spirit使ってんだが、constが厳しくて
mutableにお出ましいただいている。
>>954 大まかには950で、
struct definitionmy(const parse &self) {
boost::function<void (const wchar_t*, const wchar_t*)> fnc;
fnc = boost::bind(&parse::func, self, _1, _2);
r = str_p("hoge")[fnc];
};
void func(const wchar_t *p1, const wchar_t *p2);
これで通ってしまいましたよ。
デバッガでfuncが呼び出されるのも確認できました。
>>944 それで解決しました。でもブレークできない諸刃の剣です。
>>956 おお、VC++ 2008でもGCC 4.2.3でもエラーでない。
ってエイプリルフールはもう過ぎたぞ。見事に釣られたが。
bindで束縛するときは値渡しだからコピーされているだけだw。
ref使うとやっぱりコンパイルエラーになる。
まあ俺も人のこと笑えない。同じようにbindしている場所がある。
メンバが解析データ保持のshared_ptrだけだから何とも問題が起きなかったわけだ。
959 :
デフォルトの名無しさん :2008/04/03(木) 04:27:58
960 :
デフォルトの名無しさん :2008/04/03(木) 05:38:30
Boost.Python のビルドって、Python 自身がインストールされて いなくても完了するように見えるんだけど、正しい? Boost.Python のヘッダファイルやソースコード眺めてても Python 自身のヘッダファイルはインクルードして無いように見える。
963 :
962 :2008/04/03(木) 17:18:57
ごめん、よく探したらいろいろと Python 関連の ヘッダをインクルードしていた。とくにインクルールパス を指定していないのになぜかビルドに成功する。 bjam の魔法かな? Windows XP2
python.jam見るとレジストリから取得しているっぽい
>>953 d
夜中に手を煩わせて申し訳ない。おかげで全部のlibファイルビルドする事ができました。
bjam自体の仕様が変わったのか、libフォルダへのコピーをしなくなっていたけど。
>>965 BOOST_DIR/stage/libにはいってない?
--stagedirオプションをつけないとデフォルトではstageディレクトリの中にlibが作られる。
968 :
デフォルトの名無しさん :2008/04/05(土) 00:50:46
HAVE_ICU=1 でビルドすると extra argument icui18n なんてエラーが出て前に進めないよ! まるで僕の人生のようだ。 助けて! ICU は 3.8.1 使ってます。
969 :
デフォルトの名無しさん :2008/04/05(土) 01:08:19
736 :デフォルトの名無しさん:2007/09/26(水) 10:14:42 メモメモ vc8環境下でICU3.8をビルドしてboost.regexで使うようにすると icui18n.libとかicudata.libが無いっておこられる そこでicuin.libとicuind.libをicui18n.lib icui18nd.libに、 icudt.libをicudata.libにコピー&リネームすると通る regexのテストは一応全通過 本来はどうするべきなんだろうか… ーーーーーーーー ってコトらしいけど、どうしたもんかなぁ。
970 :
デフォルトの名無しさん :2008/04/05(土) 01:09:26
ICU3.6でも同じ現象だから、これは boost の方をいじるべきかなぁ。
libs\regex\build\Jamfile.v2の適当に該当しそうなとこ書き換えてみるとかどうよ
boost::exceptionとかacceptされてたと思うけど、その辺の最近acceptされたやつは入ってないんだね。 個人的にはintrusiveが面白そうかなぁ。
973 :
デフォルトの名無しさん :2008/04/05(土) 01:47:03
libs\regex\build\Jamfile.v2 読んで判明。 HAVE_ICU と ICU_PATH を同時に使っちゃだめだったんだ。 多分 HAVE_ICU はもう obsoleted で ICU_PATH だけ設定 すればライブラリファイルは自動判別してくれるみたい。 って、ライブラリのファイル名の問題は解決したけど、 結局以下のエラーでビルドできん・・・ G:/boost-trunk/Version_1_35_0/tools/build/v2/kernel\class.jam:93: in new *** argument error * rule object(searched-lib-target)@659.__init__ ( name : project : shared ? : search * : action ) * called with: ( icudt icuin icuuc : object(project-target)@79 : true : /C:/Program Files/ICU4C/icu4c-3.8.1/lib : object(null-action)@658 : : : : ) * extra argument icuin G:/boost-trunk/Version_1_35_0/tools/build/v2/tools\builtin.jam:349:see definition of rule '__init__' being called bjam を使いこなすには python の知識が必要なんだろうか・・・
1.35.0はMS専用なのかなー?
975 :
デフォルトの名無しさん :2008/04/05(土) 03:45:58
976 :
デフォルトの名無しさん :2008/04/07(月) 04:20:20
boost初心者で、特にrandom.hppしか使ってないのですがl、質問させてください。 標準正規分布のrandom variableを生成するクラスを作ったのですが、 class nrv { public: nrv() : gen(time(NULL)), dst(0.0, 1.0), rv(gen, dst) {} double val() const { // ここのconstをはずすとコンパイルできる return rv(); } private: mt19937 gen; normal_distribution<> dst; variate_generator<mt19937, normal_distribution<> > rv; }; 上のconstをはずすとコンパイルできないのはなんででしょうか?
variate_generator::operator()がconstでないから この説明で判らないならC++初心者スレ行ってこい
978 :
デフォルトの名無しさん :2008/04/07(月) 11:25:54
>>977 よくわかりませんでした(泣)
rv()はvariate_generator::operator()というのはわかりますが、それが手元のboost-1.34.1だと
result_type operator()() { return _dist(_eng); }
という実装になっていて、それが参照とかポインタとかを返してるから、ということでしょうか?
でもこれはdoubleを返すんじゃないかと思ったのですが。
あと、以下のコンパイルエラーの箇所でエラーになる理由は何でしょうか?
class nrv {
public:
nrv(int seed) :
gen(seed), // ここでコンパイルエラー。seedを定数(0とか1とか)にするとコンパイルとおる。
dst(0.0, 1.0),
rv(gen, dst) {}
private:
mt19937 gen;
normal_distribution<> dst;
variate_generator<mt19937, normal_distribution<> > rv;
};
>>978 C++ではメソッドにconstをつけることができる。つまり、
result_type operator()() const { return _dist(_eng); }
となっていればできる。
後者は多分、seedの型がunsignedじゃないから
オーバーロードの問題が出ているのだと思う。
>>978 - nrv(int seed) :
+ nrv(mt19937::result_type seed) :
>>978 前半部分について
result_type variate_generator::operator()() { return _dist(_eng); }
↓
//some pseudo code
result_type operator()(variate_generator * const this) { return _dist(_eng); } //@
一方、
double nrv::val() const {
return rv();
}
↓
//some pseudo code
double val(const nrv * const this) {
return (this->rv)();
}
↓
double val(const nrv * const this) {
return (this->rv).variate_generator::operator()();
}
↓
double val(const nrv * const this) {
return operator()(&(this->rv)); //@の呼び出し
}
&(this->rv)の型は少なくともconst variate_generator *だが、@のパラメータは
variate_generator *であり、variate_generator *をconst variate_generator *
では初期化できない。
判らないなら初心者スレ行けと言っておろうに
983 :
デフォルトの名無しさん :2008/04/07(月) 21:47:57
>>983 同じこと思った香具師はいっぱいいるから代表ってとこだろ
986 :
984 :2008/04/07(月) 23:33:44
>>985 boost初心者スレ無いのか…
確かにboost以前の問題を解決できる人にboost初心者スレは必要ないような気もするし
スキマにはさまって身動きできない人を救済するのはこっちのスレの役目か
普通にC++のスレで聞けば教えてくれるよたぶん
988 :
デフォルトの名無しさん :
2008/04/08(火) 18:02:39 誰か boost 1.35 + Visual C++ 8/9 + ICU で regex のビルドできている人います?? Linux ではできてるんだけど・・・