1 :
デフォルトの名無しさん :
2007/04/04(水) 14:09:06
2 :
デフォルトの名無しさん :2007/04/04(水) 14:09:31
3 :
デフォルトの名無しさん :2007/04/04(水) 14:09:44
____ progress_ |← reject| boostの中の人 display ユーザー . ̄.|| ̄ ̄ ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=- || ┏┗ ┗┗ ┏┗ ≡=-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
8 :
デフォルトの名無しさん :2007/04/06(金) 11:08:07
|:〉|:〉 / \ |:〉|:〉 r::ニミ:ヽ /:/ / ハ ヽ「:| ___「:|__ V /:/ :./ : .:./ .:/:. .:./::/ V :.:. :.: ', |:.| `コ::|" r::‐:::ヘ /:./ :./ .:: .:./ .:/:.:. .:/:/ V:.:.:l :.:.: ', ヾ} {_c:人>  ̄ ̄ {./|:. :| :.:._;|_:.:.|:.:.:./|:| " ̄ `ト|、| :.:. |:. :.| 「::.| |:.:.| イ´:| :| ハ:./ || ___ |:| |><|:. :| 「::| |:〉|:〉 「::| |:::| |:.:|:l :| ||_ハ| |:| i rテ=ミV|==⇒|::.:/ 「::|. |:::| r::ニミヽ ヾ> |:::} V|:ハ:|/ri⌒ミ リ {:i::::::::ハ.} :.::.:.:.|:/ \ ヾ> |:::} V くノ r―ト|:|:{.{:i::::::}} {:{::::::rり :.:::: :/ーー<. くノ r::‐:ヘ __ _.>ニ:| ||:.}ヾ辷タ ヾ‐c/ :.:::.:/―‐ ァ 〉 __  ̄ ̄ 「::| `つ:}| V| ||::{xxx. __,.(..・xx:/ :.:/:∧  ̄レ / ノノ `つ:} 「::| |:::|  ̄∧ V :ハ:>r::::::、_____,,. ィ/:./レ ',ー’ーく \  ̄ . ヾ> |:::}ヽヽ/ ∧ V:./V_レつ::::}}::::::::::// \ | ∨ヽ\ \ くノ ./ ///√「 ヽ/{ `Y|=/ _/⌒ ヽ |. |ハ:.:.ヽ.ヽ > / //// / | ∧ \__,人i_/‐‐┐ / }/ |i |:.:.}.ハ. ̄ く__ //:.:/ くr―レヘ..__〉イト 、_ノ ...:.〈 {⌒V./|.:.:| | {:.:.| |i | 〈 | | :.:.:.:.:.| } .ノ |l.:.| |
variantに関して質問。 apply_visitor(Visitor(), v); と書くと、vに入れた型に合った operator()が呼ばれるようですが、 これは実行時型情報を利用しているんでしょうか?
BOOST_PP で生成された switch case 見て萎えたのは 俺だけではないはずだ
11 :
デフォルトの名無しさん :2007/04/09(月) 00:15:21
anyはRTTIを利用しているがvariantに関しては知らん
なんという閑古鳥・・・ 人がいなさすぎてビクビクしてしまった progress_displayは間違いなくreject / ̄\ | ^o^ | \_/
13 :
デフォルトの名無しさん :2007/04/10(火) 02:33:19
マ. <: : : :! |:.:.:.:.:.:.:.:.:.:.:.:`' 、 .j /: : | ./7 >r_ Z: _L|:.:.:.:.:.:::::::::_;r、_:.:.:\ l/: : : フ / //⊂_ 7'ナ))::::::::::::::{f⌒ヽ!::::.__l': : :ろ/フ l l.:.:.:.: ̄ヽ=':':::::::::::::::::}ゞ___リ::::{(メV-‐'_/ | v⌒ヽ__/\__'‐=_ニ)::::::>=レト、< |}.ハ  ̄' ¬'´ .L_::.|  ̄ , -‐¬;:.| / ̄不_¨'‐┬―- 、, __ `7 /`' 、/.:.:.:.:.:.:/:乃;ィハ//ィチ心-tiヾ.:.l\l__,>,'¬_/ . {.:.:.:.:.:.:|ィ.::::ィ::ハ;::::入L !.'弋_ツ `ヽア牙!/}:\|`ー―ァ _ __ }.:.:.:.:.:.:リ:/V`'‐、L__>、 ゞ''’/イ::人.:.:.:.:.:.:.___> /レ' レ' / ノ.:.:.:.:.:.:.:'.:.:.:.:.:.:.:./⌒ヽ>、>、, ―_´,..、イ\ノ `ー―‐` ./V _ ./7/7 / (.:.:.:.:.:.:.:.:.:.:.::./:/ ,. -‐'´.:.:/へ三≡=ニ不ヽ | .__|:` : : // ):::.:.:.:、.:.:.:.:(ー'´.:.:.:.:.:.:.:.:.:/.:.:.:.:.:./ろ ̄`コ'}`i、,___ ヘ, l: : : : : | |_________ __>、::.:.:.:.`ー个.:.:.:.:.:.:.:.:.:/.:.:.:.:.:./ヱ´ ム-l {r、 __l |ー―.、ミ,、_riニュL| ,、-‐.'ニ';ー‐---―‐.'ニ .:.:.:.:.:.:.:.:\:::::::::::::):::.:.:.:.:./.:.:.:.:.:.:/_Lフ`'‐ァt⊂--'_)'r‐v'ノ r-ニH/⌒'k_/r┐  ̄ ̄ ̄ r┐ .:.:.:.:.:.:.:.:.:.:: ̄ ̄7|::::::.:.:.:.:.:.:.:.::::/_ ス::ノ}.―t;:'‐イl7フ}¨「f'l< }: {_,{.l ] }})、___, -‐.'ニ';‐- 、_, .:.:.:.:.:.:.::::::::::::::::::::V7ー―--くヽ「_::::〉iイ}7フ/¨‐ヘ`-<∠ノ-'`ー┴’フ>ヾミ'_ソス`ー--- '´ `'ー-‐ .:.:.:.::::::::::::::::::::::::::::rヲマ_ト-レ`.:.:'==イ〈 } } _<i ̄Zオ | l 厂‐┘ヽヽ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .:.::::::::::::::::::::::::::::r┴┐:.:.:.:.:.:.:.:.:.:.:.:__;}.:.ヽノ.ノr=='O.rァノ l l l: : : : : : ヽ\
「C++ concept duck-typing」でぐぐれ。
わかったような、わからんような・・・とりあえずサンクス
C++0xでも採用予定なんじゃなかったっけ concept_mapだっけか
>>17-18 サンクス。
C++0xで採用予定っぽいのは調べてるうちにわかった。
とりあえず、concept = 実装を伴わないインターフェース
って風に理解した(おおざっぱだけど)。
21 :
デフォルトの名無しさん :2007/04/12(木) 19:06:41
下記のコードで A( 1 ) in block A( 2 ) ~A( 1 ) out block ~A( 2 ) みたいな出力を期待したのですが、違いました。 ばぐですか? ソース: struct A { A(const int id) : id_(id) { cout << "A( " << id << " )" << endl; } ~A() { cout << "~A( " << id_ << " )" << endl; } int id_; }; int main() { boost::shared_ptr<A> a(new A(1)); boost::weak_ptr<A> wa(a); cout << "in block" << endl; if( boost::shared_ptr<A> aa = wa.lock() ) { aa.reset(new A(2)); } cout << "out block" << endl; return 0; }
普通に考えたら A( 1 ) in block A( 2 ) ~( 2 ) out block ~( 1 ) じゃないか?
> if( boost::shared_ptr<A> aa = wa.lock() ) { うへえ、キモい
そうか?
aaの生存期間ってif文終了時点まで、であってるかな
// ericne, 27/nov/05: CW9_4 doesn't like if(shared_ptr x = y) shared_ptr<Derived> dep = cur2->lock(); if(dep.get()) { sout << "0x" << (void*)&*dep << ','; } 使うべきだが使えない。 いつものパターンです
int main() { boost::shared_ptr<A> a(new A(1)); boost::weak_ptr<A> wa(a); cout << "org: 0x" << (void*)a.get() << endl; // org: 0x0x00033480 cout << "in block" << endl; if( boost::shared_ptr<A> aa = wa.lock() ) { cout << "aa: 0x" << (void*)&*aa << endl; // aa: 0x0x00033480 aa.reset(new A(2)); cout << "reseted aa: 0x" << (void*)&*aa << endl; // reseted aa: 0x0x00037118 } cout << "out block" << endl; return 0; } 27氏がなにが言いたいのか分からない件について
27はifの中での変数宣言が使えないコンパイラがあるとでも言いたいんだろ。 でもこれforでの変数宣言よりも古くかあるんだけどな……。
shared_ptrでは、ということだろ。 詳しい条件は知らない
みんな CVS から落としてきたやつを使ってるの? それとも 1.33.1 ?
linuxでopenvrmlというライブラリをビルドしていたんですが、 boost/ptr_container/ptr_map.hpp というファイルが見つからないというエラーが出てmakeにコケてしまいます。 /usr/include/boost/にboostのファイルはあるみたいなのですが、 /ptr_container/がディレクトリごと存在していません。 boostには/ptr_container/があるものとないものがあるのでしょうか? yumでboostをインストールしたところ、 /ptr_container/は入っていたのですが、 /usr/local/include/boost/ にインストールされてしまいました。 /usr/local/include/boost/のものを/usr/include/boost/に上書きしたらまずいでしょうか? ちなみに/usr/local/include/boost/ptr_container/だけを/usr/include/boost/ にコピーしてみたところ、別のboostのファイルの関数名と衝突?してしまいました。 boostにはいくつか種類があるのでしょうか? boostに対してもlinuxに対してもそれほど詳しくないので質問が曖昧で申し訳ないのですが、 何かアドバイス頂けるとありがたいです。
winだとcvsからのをビルドできたよサイト見ながらだったがまあvc8+stlportができなかったが
>>32 ptr_containerが入ったの割と最近だから
そういや久しぶりにチェックアウトしたらBoost.BuildがV2になったんだな。 -sTOOLSやっても変な警告でるし-sBUILDも効かないしで悩んでしまった。
V2 でいろいろ変わっているね。Visual Studio 2005 使用中。 --toolset の指定で vc80 ってできない。自動判定で msvc になる。 以前ライブラリのファイル名に vc80 って入っていた部分が vc になってるのでオートリンクで見つけられないなどなど。 Visual Studio だからかな。ほかの環境ではどう? 1.34 全然リリースされないね。
37 :
32 :2007/04/27(金) 00:43:09
>>34 レスありがとうございます。
なるほどそういうこともある訳ですか。
現在も色々と追加修正されているということですね。
試しに1.33.1のソースをmakeして、元からあったboostと置き換えてみたところ、
ライブラリのmake自体にはコケたものの関数名の衝突はなくなりました。
boostについての疑問は解決しましたので後は自分で頑張ってみます。
ありがとうございました。
>>36 --toolset=msvc-8.0
でおk
自動でバージョンが入らないのは多分バグ。
まああれだsvnでやってるからあんまかわらなん・・・・・・・
>>38 ほほう。情報THX。
俺自分で Exepress CX つかってバイナリパッケージ作ってるんで、
次にパッケージングするときにやってみるよ。
パッケージって言っても所詮大学の研究室の学生数人で使うだけだが。
move_ptrってどういうものなんでしょうか?
svnリポジトリはどこ? sf.net は CVS だけ?
めもめも boost::tokenizerでwchar_tを使うには <boost/tokenizer.hpp>のclass tokenizer宣言の後に typedef tokenizer< char_delimiters_separator<wchar_t>, std::wstring::const_iterator, std::wstring > wtokenizer; とか追加すれば良いっぽい。 と思ったけど同じようなことが数年前に個人舞炉愚に既に書いてあるな。 ノイズにしかならん。俺は馬鹿か。
1.34あたりにはデフォで入ってたりせんかのう
>>45 CVSだけー
次にどっから来たか書こうか
svn便利なのになー
21 名前:デフォルトの名無しさん[sage] 投稿日:2006/09/24(日) 17:51:52
Visutl Studio 2005 Express Edition で Boost をインストールしようとしたのですが
ワーニングがいっぱいでて1時間以上まって エラーも5個でて、
regexp の例題をコンパイルしてもエラーでだめでした。(エピステーメさんのHPの)
Boost を 2005 EE にインストールする方法を書いてあるHPがありましたが教えてください。
よろしくおねがします。
34 名前:デフォルトの名無しさん[sage] 投稿日:2006/09/26(火) 12:54:58
>>21 多分一部のlibコンパイルに失敗してる
奇遇にも昨日EEへの導入したときに同じヘマしたので俺の場合の解決手順を書いとこう
EEインスコの自動設定以外の(SDKとかへの)パスは通してない
set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat をDOS窓に投げて実行
bjam -sTOOLS=vc-8_0 --prefix="C:\Program Files\Microsoft Visual Studio 8\VC" install
事前にDOS窓の高さバッファ9999にするとか
--prefix をわざとD:\Prog.. ってして作業内容把握できるようにすると判りやすいかも
関係ないけど、DOSってscriptコマンドみたいのは無いのかね
本当に関係ないね。
しかしboostは、アルゴリズムや数学に関する機能は豊富だけど、 アプリ開発にはいらんような機能ばっかだな。 まあC++の用途を考えれば、そういうのに偏るのも分からないでもないが。 個人的にはXMLのパーサを入れてほしい。
言いだしっぺの法則
apache のヤツでええやん。
boostはC++の委員会によって標準化されたライブラリだからこそ使うに値する。 よく使われるような機能がないからといって、 その辺で公開されているライブラリを使おうというのであれば、boostの存在価値が薄らぐ。
じゃあいつまでも独りでグチグチ言ってろ
spiritは面白いけどコンパイルが重すぎるなぁ
XMLパーサなんかいらねえよ でもそのうち入るんだろうなあ
SerializationのXML読み書き部分から独立なんてことになったりして。 xml_archive読んだことないから、そんなことができるかどうかは知らないが。
boost1.34.0をVisualC++7.1(2003)でコンパイルしたのですが、 同じライブラリファイルで名前にバージョンが入るのと入らないのができてしまいました。 たとえば、 boost_filesystem-vc-mt-1_34.lib と boost_filesystem-vc-mt.lib です。 なぜ二つあるんでしょうか? そしてどちらを使えばいいんですか?
バイナリを比べて見たら?
まったく同じものです。 Windowsではシンボリックリンクが使えないので、 このように同じファイルを用意したのでしょうか?
>>63 Jamfile読めば分かるけど少なくともNTFSではハードリンクになってるはず。
bjamのコマンドの末尾に > log.txt つけるのでもいいぜ。
66 :
デフォルトの名無しさん :2007/05/07(月) 20:57:49
バージョンのついてるのとついてないの、 どっちをリンクすればいいんですか?
VCならパスの設定しておけば自動でリンクされると思うが
69 :
デフォルトの名無しさん :2007/05/09(水) 00:50:40
XMLパーサーもまだ入ってないのか。まさに無駄な糞ライブラリだな。
progress_displayはあるけどな
だいたい余分な機能が多すぎなんだよ。八元数なんていったい誰が使うんだ。 そりゃ使うやつはいるかもしれないが、準標準C++ライブラリを謳うBoostに入れる意味があるのか?
要らない人は使わなければ良いだけでは?
3Dで使う人もいるんでない?
四元数は使うだろうけど、八元数まで使うの?
クォタニオンも3Dグラフィックス以外では使い道なさそうだなあ。 それにDirectXにはクォタニオンのクラスが元々あるんだからそれ使うだろうし、 OpenGLにも多分あるだろうからわざわざBoostのを使う人はいないだろう。
OpenGLにはクォタニオンは無い。DirectXのはいろんな意味で使いにくい。 複素数なんかと同じ意味で「標準ライブラリ」に組み込まれるのはおかしくないと思う。 複素数だって使わない人はいるでしょ?
じゃあクォタニオン使わずにuBLASの行列で演算すればいい。
4と4x4じゃコストに差がありすぎる。
お前ら、progress_displayが泣いてるぞ。
81 :
デフォルトの名無しさん :2007/05/10(木) 12:16:14
ここでboostの質問してもよかですか?
progress_displayって生きてる意味あるの? まぁ、もうとっくに死んでるんだけどね。 お前ら実はシックスセンスの持ち主なんじゃないの?
いいえ、僕はセックスシンスの持ち主です。
僕はソックスモエス
85 :
デフォルトの名無しさん :2007/05/10(木) 14:48:05
グラフ関数のまとめサイトある? なんか面白そうな事が書いてあるから使って見たいんだが
>>86 学校の問題でSTL使ってるのはじめてみた・・・・・orz
ブーストを使うお前らブースターだな
cmake どうなるんだろ unix,win混在環境なので非常に気になる
91 :
デフォルトの名無しさん :2007/05/11(金) 18:11:00
>>86 こういうページを見ると
東大すげえなって思う
using namespace std;
>>93 この俺様のソースファイルでは、名前が衝突してないよという意味だからいいだろ、別に。
using namespeceを使うのは、gotoを使うのと同じぐらい初心者だ。
「gotoは絶対にダメだ」と言う奴は「自称上級者、実際初心者」だ。 using namespaceもgotoと同様に、絶対ダメなものではない。 96こそがホンモノの初心者だ。
まだ経験が足りないだけかもしれんがgoto使わないとヤバイって状況には陥ったこと無いな 例外を使わざるを得ないって状況はC++やり始めた頃から結構遭遇してるけど 制約が多い環境でのプログラミングならそういうのもよくあることなのかゐ?
上級者という者は、初心や上級というものを気にしない。 という自己言及のパラドックス。
>>98 C++だと例外があるからな。
Cだと異常処理の時に便利だよ。(マクロとコーディングルールも合わせて使うけどな)
gotoやループ内でのswitch-caseによるフラグ操作も原則禁止だな。 ただし状態遷移のプログラムの場合は堅い設計の上で意図的に使う。 問題の本質がそうであるから。
兵が恐れずにusing namespaceを使うスレでも立てるかな
そんな話、C++初心者スレかどっかでやれよ
Regexって日本語通るようになりましたか?
「日本語通る」というのにもいろいろ水準があるような?
ワイド文字バージョンなら今も昔も使えてるんじゃね。 サロゲートペアが混ざった場合にどうなるか知らんけど。
2重ループの抜け出しには迷わずgotoする俺は真の猛者。
SJIS範囲内だけでいいなら16bitSJIS使うという裏技もある
UTF-8使え
EUCを使え
ヘッダファイルでは使わんが、 ソースで using するのは別によくね?
画面内に収まる程度のコード内なら普通に使う。
関数スコープ内だったらusing宣言は自由に使っていいと思う。
書くときは楽だが、保守するときは大変。 なので、stdしか使ったことないな。
使わないほうがその関数を使ってる場所を検索一覧するときに楽。
長い名前空間があった場合ってどうしてる? エイリアス作るの?
namespace hogehoge = sexualvioletmikomikonurse;
エイリアス作るの?の意味がわからなかったのか?
sumimasen
実際何文字あっても先頭数文字が特徴的ならIDEの補完で終わるからいいんだけどな
入力が面倒なんじゃなくて、 sexualvioletmikomikonurse::tokachitukuchite::gossungossungosunkugi(...); なんて読みたくないだけ。
つか、実際にそういう名前に遭遇するか? 俺は経験ないが
まあないけど。
>>122 真ん中のがなんだか解らなかったのが悔しい。
セクシャルバイオレットみこみこナース::とかちつくちて::ごっすんごっすん五寸釘();
やっぱヘッダの中でusingするのは抵抗感じるな。 includeの後だったら影響無いのは判っているけどね…… ソース中でusingしたときのリスクってなんかあったっけ?
↑↑アイマスじゃなかったっけ? 実物は見たことないけど。五寸釘は知らない。
>>126 using って using directive なのか using declaration なのかどっち?
どちらにせよ
>includeの後だったら影響無いのは判っているけどね……
はちょっと意味が分からないのでもうちょっとkwsk
>>126 using namespace foo; は原則として使わない。
using foo::bar; は必要があれば使う。
ネームスペース全体をusingすると、先方のネームスペースの変更で名前が衝突するリスクが発生する。
すごい勢いで話がずれてる
sumimasen
参考書だとスペースの都合上 using するのは仕方ない。
C++は木材資源にも優しい言語でした
アイマス作るの?の意味がわからなかったのか?
ヲタばっかだなこのスレ
boost::shared_ptr< boost::variate_generator< boost::mt19937, boost::uniform_smallint<> > > みたいなのは適当にtypedefしとけって事ですか?
うん
↓他人のtypedefの定義名が気に入らなくて、結局、全部のソースを直した奴
141 :
デフォルトの名無しさん :2007/05/13(日) 10:11:47
Boost 1.34 age
↑ 新機能も使わないのに何となく入れ替えてみる奴
Boost1.34リリースですか。 Filesystemもようやっと国際化(UTF-8/UTF-16対応)か。 Xpressiveがboostの仲間入りですな。 Xpressiveて、マルチバイトOKだったっけ? ドキュメント斜め読みする限りは対応していなさそうな感じだったけど……
ドキュメント斜め読みしたらそのものずばりがあるようなんだが。 試してないが。
あ、localeに対応しているって書いてあるね。スマソ。 後で試してみよう。
1.34来てるのになんでこんなに盛り上がってないの?
cvs派が結構いるから、ドキュメントさえあればって感じ
149 :
デフォルトの名無しさん :2007/05/14(月) 12:41:26
visual studio 2003にboostをインストールしたら boost::reg_expression<char> regex = "[a-zA-Z].*[a-zA-Z]"; でerror C2262: 'regex' : 破棄できません。 というエラーが出ます インストール失敗?
>>53 そういうのは別のライブラリを使え、ってことじゃないかなぁ。
って、何がスタンダードなのかな。
Expat とか libxml とか?
Windows なら MSXML もあるね。
151 :
C2262 :2007/05/14(月) 14:52:48
Compiler Error C2262'identifier' : cannot be destroyed
http://msdn2.microsoft.com/en-us/library/aa983690 (vs.71).aspx
The object cannot be instantiated because the appropriate destructor,
though defined, is not accessible.
The following sample generates C2262:
// C2262.cpp
class B
{
~B();
};
class D : public B {};
D d; // C2262, B's destructor is private
>>149 代入演算子とコンストラクタの違い分かってる?
boost::regex regex("[a-zA-Z].*[a-zA-Z]");
153 :
デフォルトの名無しさん :2007/05/14(月) 17:23:49
ところで、漏れ Windows でのプログラミングってあんまりしたことなくて、 たまに下としても市販のライブラリを購入したことがなくて、 フリーのものばかり(代表的なものが boost)使ってきたんだけど、 市販の開発用ライブラリはどんなインストーラになってるの? インストールすると C:\Program Files\ 以下にインストールされてしまうの? 自分で Boost を Windows にインストールするときには C:\usr\lib とか C:\usr\include とかにライブラリのバイナリとヘッダを 置いているんだけど、Windows 的流儀ってのがあるのかな? つーのは、1.34 も出たことだし、内輪で使うためにバイナリパッケージを インストーラつきで作ろうと思ってるんだけど、パスをどうするかが 人それぞれで好みが違うってことが分かってデフォルトは何にしたらいいのかなって。
>>153 Program Files\xxx\includeにヘッダ、Program Files\libにライブラリが一般的だと思う。
インクルードパスや、ライブラリパスがやたらと長くなるけど、プロジェクトに一回設定したら
実際のコマンドライン生成はIDE任せなんで気にしない。
unixでもpkgconfig使いだすと、コマンドラインで1kbyteとか行ったりするし。
マニュアルのsplitの説明が間違ってる string str1("hello abc-*-ABC-*-aBc goodbye"); typedef vector< string > split_vector_type; split_vector_type SplitVec; // #2: Search for tokens split( SplitVec, str1, is_any_of("-*") ); // SplitVec == { "hello abc","ABC","aBc goodbye" } // ↑これ誤り。正しくは "hellow abc", "", "", "ABC", "", "", "aBc goodbye" // is_any_ofは正規表現的には[-*]つまり「a-*-b」は「a,,,b」のような意味 ※ boost::algorithm:splitはdisplay_progressの兄貴分w
156 :
デフォルトの名無しさん :2007/05/14(月) 20:24:03
なるほど、インクルードファイルについては各ライブラリの ディレクトリ以下の include に、バイナリについては \Program Files\lib という共通のディレクトリというわけですか。 バイナリが共通のディレクトリになっている理由は 動的リンクライブラリへのパスを一箇所にまとめるためですかね。 スペース入りのパスにいろんなものを置くのが気持ち悪くて、 Windows での流儀を知りたいと思っていました。
デフォルトは C:\Program Files\組織名\ソフト名\ の下にして、気持ち悪い人はインストーラの操作で 変更できるようにするのが良いと思う。なお、C:\Program Filesなどのパス名はハードコードしないで SHGetSpecialFolderPath などで取得するべし。(念のため)
158 :
デフォルトの名無しさん :2007/05/15(火) 06:59:15
>>157 インストール先ですが、組織名ってのはとりあえず省略して、
C:\Program Files\Boost で。パス名については ExePress CX
でパッケージングすると自動的で取得してくれるようです。
シェアードオブジェクト(dll)も
C:\Program Files\Boost\lib 以下に配置すべきですかね?
それともすでにパスが通っているどこかにコピーすべきでしょうか。
しかし C:\Windows\ 以下なんぞに *.dll をコピーすると
ぶっ殺されそうな気がするので、これまた Windows の流儀ってのが
あるんでしょうか?
159 :
デフォルトの名無しさん :2007/05/15(火) 07:02:22
ちなみにすでに C:\Boost\ をデフォルト位置にした 1.33.1 と 1.34 の Windows + VC++8 用バイナリパッケージと ICU のバイナリパッケージは作りました。あとは 1)C:\Boost\ って Windows 的にはどうよ。 2)アンインストーラ対応にすべき? それとも単にターゲットフォルダに展開して終わり? 3)DLL はデフォルトでパスが通ってそうなところに突っ込むべき?
アンインストーラにも対応してないような半端なインストーラなんて無いほうがまし。 レジストリを書き換えたり、スタートメニューに挿入したりするのなら、アンインストールにも 対応するべきだし、そうでないプログラムなら単純にZIPファイルで配布するのが良いだろう。 ご存知だと思うが、標準でWindowsではZIPファイルはフォルダとして見える。 どうせプログラマしか使わないのだから、配置は任せるのが良いんじゃないかな。
>160 Win2kはwindowsじゃないですか、そうですか・・・
終わってるWindowsだな。もちろん終わってるから悪いというわけではないけど。
だがそれがいい
圧縮フォルダが使えることと、zipがシームレスにフォルダに見えることは同じ事なのか?
圧縮フォルダでZIP書庫はフォルダとして見えるがシームレスではない
所詮はshellのオマケ機能だしな。 NTFS標準の圧縮フォルダならシームレスと言えるのでは。
>>129 その書き方じゃあ、ネームスペース全体をusingしなけりゃ
その問題が起きないように読めるが、そんなことは無いだろ?
ADLあるし。まあ、程度の差はあるだろうが。
これはなんなの?
::: 唐突に ::: boost::gui の話ってどうなったの?
C++でクロスプラットフォームなGUIはQtを使えばいいだろ
他にもwxやらGtkやらfltkやら乱立してるからなぁ・・・ 良い物ができたとしてもboostの入り込む余地はあるんだろか
Notusちょっと面白そうだったが…放置されてるな
175 :
デフォルトの名無しさん :2007/05/22(火) 12:24:48
dotoneto
GUIに速度は不要だからもはやC++でGUI作る意義は薄いと言えなくも無い スクリプトエンジンに外注した方が楽だな
UIもOpenGLやDirectX使うのが今の流れ
CUIでも?
CUI自体が今の流れじゃないだろw
GUIはズールで
2;\cGDI;y5u/90%.e/)4tu@jxf,/4x/d0-:/y/?
c++と組み合わせて使うのに便利なGUIってなんだろ c++である必要もないんだよね
ATL+WTL
CUIに2本毛が生えたのがGUI
186 :
デフォルトの名無しさん :2007/05/23(水) 20:30:57
C++/CLI ・・・ってすでに C++ じゃないか。
GUIと一口にいっても、グラフィックをバリバリ使うようなソフトは やはりC++でないと処理が追いつかないこともあるから使われるだろう。 そうでない伝票入力とか在庫管理とかのオーダーメイドアプリは もはや完全にWebに移行している。 もっともユーザインターフェースが最新のWebでも、 データベース入出力はいまだにCOBOLが使われたりするところもあるわけだが。
まあboostを使うような人はそういう売り物ソフトとはまったく無縁の人たちだろうけど
基幹にはやはりCOBOLを選ぶ by 不治通
NECのACOSシリーズもCOBOLだよ
Webアプリって紙の呪縛があるだろ。 帳票とかネックになんないの?
Japanese OK.
質問してもいいですか? 環境:c2d,OSX,i386,ppc(ロゼッタで確認だけ),Carbon使用 試してるboostライブラリは全てスタティック用でi386とppc(両方32bit)のユニバ 最適化はO0〜O3まで全部試してます。 regexライブラリをリンクしただけで、コード内で使わなくても2286byte〜3???byteメモリリークしちゃう 1331と1340リリース版両方で同じ状態、i386実行とロゼッタ実行でリーク量が数byte違ったり ライブラリのO0〜O3の影響でもリーク量が変わってます、が、リンクしただけでリークするのは変わらず。 誰か修正方法知りませんか?、LeakTracerでソース位置が特定できなくて自分のレベルでは追いきれず。 (リークはするけど正規表現の動作そのものは一通り問題なかったりします、2286は固定で持ってるテーブルかなにか??) (regex以外のビルドの要るライブラリはfilesystemくらいしか使ってませんが1331でも1340でもリーク無し) xpressiveをOSX(Carbon使ってる状態のXcodeプロジェクトでしか試してないけど)で使うには struct nil;とかのnilがobj-cのnilあたり?と被ってるようなので ローカルな名前で書き換えて良さそうなnilは全部リネーム これで"static regex"ではないregex風の方は一通り動きます、regexとほぼ同じに使えてリーク無しなのでこっち使ってます。 Let's boostさんにある"static regex"の方は boostヘッダ側のエラーの表示された順に危なそうな変数名でローカルな物をリネームしてみていっちゃうと compile_resultの typedef typename compiler_type::BOOST_NESTED_TEMPLATE apply<op_type, State, Visitor>::type type; で行き詰まりました。誰か対処方法知ってたら教えてください、高速らしいのに使えなくてしょんぼりorz
訂正 #include <iomanip> #include <boost/xpressive/xpressive.hpp> の順でインクルードしておけば"static regex"いけました、無知でごめんなさい
質問するならそれなりの書き方があるだろう。 〜ちゃうとか、orzとか、2chだからまともな書き方しなくていいと思ったら大間違いだ。
べつに訊き方なんでどうでもいいと思うが。 気に食わない奴は答えなきゃいいんだし。
僕は回答者をやってるつもりだから偉いんだぞお! って言いたいだけだから華麗にスルーでいいよ
マルチを毛嫌いしてるのとか、マルチは悪みたいな風潮もなんだかなーと思う。 なんか昔のfjみたいな堅苦しさを感じる。別に感謝されたくて返答してるわけじゃないんだし。 マルチ嫌いをスルーすりゃいいんだけど。
いや、悪だろw その自覚がないのはもっと手に負えないな。 どうしても複数箇所に投下したいなら、 その旨を記述しておくべき。
NetNewsの場合は、 一つの記事を複数のグループにpostする機構があり、 ヘッダを見れば、他にどこのグループにもpostされていたか分かった。 メールのTo:のようにNewsgroups:に複数グループを記述できた。 この機構を使わず、個別にpostする行為のことをマルチポストと言ったから、 技術的に批判するだけの根拠があった。 豆知識な。
>>198 お前、マルチがなんで嫌われるのか本質的なことを理解できてないだろ。
スレ違いで伸びるウザさも理解して欲しいもんだがなぁ。 まぁ自分にだけ寛大なのはお互い様ではあるが。
手広く書き込んだほうが回答を得られる確率が上がるのでインターネットリテラシーに優れているといえるでしょう。
電柱一本に尋ね人のポスター貼るより 電柱百本に尋ね人のポスター貼る方が効果的
合理的
コスト対効果の問題 電柱一本に貼るのと電柱百本に貼るのとで、は前者の方が経済的
電柱全部が自分の自由にして良いものだと思ってるのが間違い。
電柱全部が自分の自由にして良いものだと思ってると思ってるのが間違い。
スレ違い
電柱に立ちションするとbootsが汚れるからやめような せめて座りション
電柱にウンコしちゃだめだからね
boostのいい日本語リファレンスマニュアルがないので、 wikiを作ろうと思うんですが、作ったら書き込んでくれるひといますか?
俺が個人的に使ってる誤訳抜け満載のを張ってやるよ
>>213 新しく始めるより、翻訳プロジェクト進めてくれよ。
翻訳プロジェクトはどこにあるんですか?
こんだけライブラリの数が多けりゃ 翻訳プロジェクトとか途中で頓挫するに決まってる
一対一対応の翻訳を目指すから挫折する 俺の書いたprogress displayの訳なんて一行だぞ一行
だからプロジェクトにするんじゃなくてwikiにすればいいんだよ
まスパムが未来永劫無くならない事から見てもマルチの効率はいいんでしょ。
pythonでGUI Boost.pythonでc++と結合
で、pythonのGUIライブラリって何よ? となって振り出しに戻る。
ptgtkとか、pyqtとか
wxPython一択じゃね?
90%くらいのパソコンはMFCが動くんでないの?
そこはεπιστημηが管理人じゃねえか。 今はなきCマガジンのそいつの連載を知ってるが、 無知で無教養でネタもつまらん、最低の連載だったぞ。 さらにロリ系のエロ漫画家と交友関係があって、そいつの絵をCマガジンにも載せたほどだ。 Cマガジンが廃刊になったのはこいつのせいだ。俺は絶対許せん。
>>229 あーあ
また博之の名誉毀損の賠償額が増えちゃったよw
>>229 *.cppll.jp の管理人は tietew だぞ。
επιστημηって紀元前のεπιστημηのこと? やっぱり違う?
紀元前の奴がまだ生きてるわけないじゃん
>>229 エロ漫画家と知り合いなのはエピステーメじゃなくフィンローダの方だぞ。
まあどっちもCマガの記事はつまらんかったが。
おまえらカウントクラスをバカにすんな
>>222 今filesystemが書かれているけど
pathではなくbasic_pathにしたほうがいいと思う
wikiなんだから自分で直せば?
229の誰かトップに貼れよ
記事名を変える方法がわからん。 ってすまん、今名前変更に気が付いた。
で、変更しようとしたら管理者パスワードを要求された やっぱり俺にはできないようだ
初歩的な質問で申し訳ありません。 lambdaに条件演算子に相当するものはありますか? 以下のようなファンクタをさくっと書く方法を知りたいです。 struct MyFunctor : public unary_function<bool, const char*> { const char* operator()(bool x) { return x ? "YES" : "NO"; } }
>>244 if_then_else_return(_1, "YES", "NO")
246 :
244 :2007/05/29(火) 11:36:46
ありがとうございました。
$ cat ./test.cpp && g++ test.cpp && ./a.out #include <iostream> #include <deque> #include <boost/lambda/lambda.hpp> using namespace std; using namespace boost::lambda; int main () { typedef deque <double> Container; Container c0; for (size_t i (0); i < 10; ++ i) c0.push_front (i); Container c1 (c0); cout << "max: " << *max_element (c0.begin (), c0.end ()) << '\n'; for_each (c0.begin (), c0.end (), _1 /= *max_element (c0.begin (), c0.end ())); cout << "c0: "; for_each (c0.begin (), c0.end (), (cout << _1 << ' ')); cout << '\n'; for_each (c1.begin (), c1.end (), _1 /= 9); cout << "c1: "; for_each (c1.begin (), c1.end (), (cout << _1 << ' ')); cout << '\n'; return 0; } max: 9 c0: 1 8 7 6 5 4 3 2 1 0 c1: 1 0.888889 0.777778 0.666667 0.555556 0.444444 0.333333 0.222222 0.111111 0 最近lamdaを使いはじめました c0とc1の内容が異なってくるのですがこれはしょうがないんですかね このへんの解説ページなんかあれば教えていただけるとうれしいのですが
思いっきり/9で割ってるやん
,,,ィッッシミ彡三ミ、, /彡彡三三三ミミ彡ミ、 /彡彡へ-‐'''゙゙⌒´ヽ、ミミミヘ {彡彡-''゙゙ U ミミヘヘ{ |彡;{ u ミミミミ |彡i ィッァ、 ィ≡ミ、 }ミミミ r-;;{´ ィェァ、}--{ r‐ッ-、 }‐‐;;r''´} ヽヽ_'゙__ノ,' ',ヽ__''゙__ノ :|/::) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ `| /(、, ,, ) :::|::,.} < そろそろイキそうだ、中に出して良いかい? ヽ', ヽ弋''‐'''フ-ノ ,::ノ ハァハァ ヽ,、 `‐‐'''´ ,.::::::ノ /ヽ、__ニ___ノ''゙ .⌒\ アンアン / 人 。 。 丿\ \ \ \| 亠 / / / パン / ̄ ̄ ̄\ \⊇ 干\ ⊆ / i'_liノ |_|iトil_}__,l ( 。 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |i.}┃ ┃ ミ;i|《 /⌒v⌒\ ) < 社長〜中出しして良いから次も主役お願いね♪ |lヽ'' ヮ ''' ,_) l/⌒\ ノ ) | \___________ / | | | | パン | |. Y | |__/ | | パン | |ヽ__人___ノ| ト' | |/^ヽ | | ゜ ゜ | |_/ ヽ__人_ノ ⊆, っ とーっ 〜〜〜〜〜その頃堀江ヲタは…〜〜〜〜〜〜 ほっちゃんは天使だおハァハァ シコシコ (*´Д`) シュッ シコシコ Σ⊂彡_,,..i'"': |\`、: i'、 \\`_',..-i \|_,..-┘
>>247 なんだこれ…
lambdaはデフォルトで定数項を参照で保存するのか。
constantで回避できるけど、なんでこうなってるんだろ。
>247
>250
脊髄反射で全くはずれた事を書きそうになったけど、ちょい調べてみた。
↓の通り、基本的に lambda は参照ではなくてコピーした値を保持している。
ttp://www.boost.org/doc/html/lambda/using_library.html#lambda.storing_bound_arguments が、(↑にも書いてあるけど)複合代入演算子の左辺は参照で保存される(当たり前)。
で、(多分実装の手抜きのため?)左辺と右辺で参照か値かが異なる場合が対応されていないため、
/= の右辺も(const だけど)参照で受けてしまう。
cf. lambda/detail/operators.hpp
そのため、
_1 /= *max_element (c0.begin (), c0.end ())
の代わりに
_1 = _1 / *max_element (c0.begin (), c0.end ())
とすると、結果が c1 と同じになる。
252 :
247 :2007/05/30(水) 03:18:16
>>250 ,251
よくわかりました
有難うございます
STLってさbegin (), end ()とか渡さなくても 上記のメンバ関数有るの分かってるんだから クラスのポインタ受けとりゃいいんじゃないの
>253 組み込み配列を渡したくなったときのことを考えてみよう
>>253 boost::rangeがまさにそれをやってる。
>>254 既存のコンテナの一部を渡すのもそうだな。
>>253 オブジェクトへのポインタの間違い?
開始点と終了点を渡すiterator式のインターフェースの方がずっと汎用性がある。
例えば、途中から渡したい場合、
iteratorを持たない集合型オブジェクト上のiteratorを自前でつくる場合、
変換iteratorを使う場合など。
この辺の議論は20〜30年前に決着済みです。
>>256 コンテナがあればイテレータふたつは簡単に手に入るし、
イテレータがふたつあればそれを仮想的なコンテナとみなせるから、
コンテナとイテレータのどっちを基準にしても汎用性は変わらないだろ。
むしろ、利便性の問題。
>>255 > 既存のコンテナの一部を渡すのもそうだな。
などの利便性は、汎用性と言ってもいいのではないでしょうか。
2つのイテレータを引数に取る関数のラッパとしてコンテナの参照を引数に取る関数を作るのは容易だが、その逆はそうはいかない。
突っ込みやすい話題だとレスがいっぱい付くね
関数オーバーロードできるんだから 両方用意しとけばいいんだよな
まーJAVAやVC、BCCのクラスライブラリと違って浅い抽象化だから。
C++の試験ってあったけか?
boostってネットワーク系ある?
asio
双方向リストに対してboostのregexを使いたいのですが、どうやったらいいんでしょうか。 BidiIteratorを自分で実装すればできるっぽいのですが、よくわかりません。 誰か教えてください。
何が分からないのか分からないって状態みたいだから、 まずはiteratorについて学ぶよろし。
イテレータはだいたい分かっているつもりです。 std::listなんかでよく使うので。
BidirectionalIteratorの実装法が分からんってこと?
272 :
268 :2007/05/31(木) 23:47:32
たとえば、 struct node{ char c; node *prev, *next; } というノード構造体のリストで構成された文字列があるとして、 これに対してboostのregexを使うにはどうすればいいのかということです。
273 :
268 :2007/06/01(金) 00:00:33
272のような構造体ではなくて、std::list<char> に対してregexを使う方法でもいいです。
std::list<char>::iterator ????
きちんとやろうとすると長くなるので要点だけ。 struct honya : public std::iterator<std::bidirectional_iterator_tag, char> { honya(const node *n = NULL) : node_ptr_(n) { } // あとoperator=()もあったほうが。 honya &operator++() { node_ptr_ = node_ptr_->next; return *this; } honya &operator--() { node_ptr_ = node_ptr_->prev; return *this; } // 同様にoperator--(int)とoperator++(int)も定義すること。 char &operator*() { return node_ptr_->c; } // const版もいるかも。 private: node *node_ptr_; }; boost::regex_search(honya(&first_node), honya(&last_node), ...
書いている間に…
>>273 それなら、
std::list<char> l;
regex_search(l.begin(), l.end(), ...
でいけるはず。
277 :
268 :2007/06/01(金) 00:27:11
どうもありがとうございます。 こんな長いコードまで書いていただいて恐縮です。
regexは文字列に対して使うんだよ。
文字はcharかwchar_tしか使えないけど、 文字列のデータ構造はイテレータさえ実装すれば自由だよ。
281 :
デフォルトの名無しさん :2007/06/02(土) 14:52:12
using namespace boost:lambda; boost::function<boost::uint64_t(boost::uint64_t)> f = _1 + _1; 引数のboost::uint64_tをunsinged int に変えるとコンパイルできるのですがboost::uint64_tだと c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\boost-1_33_1\boost\function\function_template.hpp(119): error C2440: 'return' : 'boost::lambda::lambda_functor_base<Act,Args>::sig<SigArgs>::type' から 'boost::uint64_t' に変換できません。 とコンパイルエラーになってしまします。 コンパイラはvc7.1です。
boostをインストールする場所なんですが linuxだったら, /usr/local/include にboostおけばいいのかな まだboostに正式にacceptされてないのは /usr/local/share/include あたり?
Linuxだったらrpm様の言う通りw
RHEL5なのでrpmないんです
RHELならサポートに電話
まぁ確かにその為に金払ってるんだしな
Fedora の rpm を使えば良い
たいてい使えるよ
使えなかったら、rpmbuildするとか。 いろいろあるだろ
MFCのTRACEのようなものはboostにありませんか?
292 :
デフォルトの名無しさん :2007/06/22(金) 01:59:52
Boostで一番高速なアロケータは何よ?
シングルスレッド版のpool
>>291 boost.formatを使って、
assert(cerr << (format("value = %d") % value) << endl);
とかじゃだめなん?
296 :
デフォルトの名無しさん :2007/06/22(金) 19:22:42
テンプレート関数で引数として渡されたものがdelete演算子の引数に出来るかどうかを concept_checkで保障したいわけなんですが 「delete演算子の引数に出来る」ってことのconceptってありますかねぇ?
すいません速攻自己解決しました>< そのためのconcept作ってやれば良いんですね(汗
場合によるけど、不完全型のdeleteを認めないようにすることも考えたほうがいいよ
shared_ptrかなにかでそれチェックしてなかったっけ
checked_deleteを使っているはず
sandboxも含めたら(含めなくてもだけど^^^)とてもじゃないけど全部使いこなせる気にはなれないぜ…
自分が必要なものが使いこなせればいいんじゃないの といいつつspirit使ってコンパイルエラーになると右往左往する俺
すみません、質問です。 boost::lambdaで、PODな構造体のメンバ変数へアクセスする方法はありますか? 具体的には、以下のような構造体があるときに、 struct MyPOD { int foo; }; 以下のような感じのファンクタを書きたいのです。 _1::foo += 1 どうか宜しくご教示願います。
>>303 bind(&MyPOD::foo, _1) += 1
( &_1 ->* &POD::foo ) += 1 というような手もあるが、どうみてもbindの方が分かりやすいですね本当に(ry
306 :
デフォルトの名無しさん :2007/06/26(火) 04:26:32
308 :
デフォルトの名無しさん :2007/06/26(火) 09:04:07
>>307 おお、ありがとう。
ところで、boost::filesystem::path を使うと
Visual Studio 2005 の IntelliSense が
UnintelliSense になっちゃうんだけど、
これはどうしようもない??
IntelliSense が無いと生きていけない体になっちゃった。
ヘッダをプロジェクトに加えれば結構効くようになるお
lambdaとかつかうとintelisenceどころじゃないが、一応どうしても使いたいってんなら そういう時はいったん終了して*.pdbを削除して開きなおせばまた認識してくれるようになるよ
*.ncbでしょ
経験上、これを消しても効果ないことが多い
で、
>>309 のような結論に至った
ほうほうなるほろ 書いたヘッダを自動的にプロジェクトに取り込むようなマクロ使えば自動化もできるし、俺も使ってみるよ
omaera shinsetsu desu ne.
だ、だめだぁ ヤパーリ UnintelliSense ダターヨ(笑
boost::progress_display ってなくなっちゃうの?
それは困るなあ(笑)
std::map<int, int> m; : std::for_each(m.begin(), m.end(), /* */); boost lambdaでmap各要素のsecondに定数を代入したいのですが どのようにしたらいいのでしょうか? vectorだったら _1 = N でいいのですが、mapだとstd::pair<const int, int>なのでどうしたらいいのかわかりません。
( bind(&std::pair<int,int>::first, _1) = 0 ) これでいけるはずだけどconst intからint&に変換できないとかぬかしやがる もし可能だとしてもconstはずしとか参照作成とか面倒そうなので 素直に関数オブジェクト自作してやった方が楽っぽい
志村ー、second,second!!!
アッー!!えらい勘違いしてたごめんだぜ とりあえずこれでできるっぽい std::for_each(m.begin(), m.end(), ( bind(&std::pair<const int,int>::second, _1) = 0 ) );
321 :
317 :2007/06/26(火) 16:15:44
>>320 ああ、メンバ変数へのポインタ使うんですね。
でも…なんかパッと見分かりづらくて…微妙ですね。
ありがとうございました。
… map m; { using namespace boost::lambda; using boost::for_each; typedef const map::key_type key_type; typedef map::mapped_type value_type; typedef std::pair<key_type, value_type> pair; for_each( m, bind( &pair::second, _1 ) = 0 ); } { class assignSecond : std::unary_function< std::pair<const int,int>&, void > { public: assignSecond(int value_) : value(value_) {} result_type operator()(argument_type arg) { arg.second = value; } private: int value; }; boost::for_each(m, assignSecond(0)); } … typedefとか使って無理やり「処理してる部分だけは」見やすくしても ローカル関数オブジェクトを使うのと大して変わらない手間だからなぁ(処理効率はlambdaの方がいいらしいけど) 同じ型に一連の処理をするなら最初にまとめてtypedefでもしてシンプルに記述できるかもしれんが いまいち使いどころが分かりにくいライブラリだ…
pair の型は map::value_type でとれますよ。 ちょっとだけ端折れる。
boost::filesystem::pathのマルチバイト対応予定ってないの…? wpath使えって事なのか?
boostがというよりC++自体がマルチバイト文字列を 直接いじくることを考慮していない感じ。
世の中も何だってUnicodeにすればおkという風潮だしな
327 :
デフォルトの名無しさん :2007/06/26(火) 22:09:53
BOOST_FOR_EACH じゃいかんの?
なんとなくlambdaが使いたい気分なんでw
range_exって何故sandboxから出せないの? 何か問題があるのかな? 早く使いたいんだけど、sandboxのを仕事で使うのは微妙だしなぁ。
どうせ内部でboost::begin(container), boost::end(constainer)を呼びだして stlアルゴリズムを適用するもの書くんだからsandboxだからと言って避ける必要ないジャンとか思うけど そこはややこしい内部仕様の思わぬ罠とか恐れての事なんだろうね
#include <valarray> //#include <boost/range.hpp> #include <boost/range_ex/algorithm.hpp> int main() { enum { ARRAY_SIZE = 10 }; typedef std::valarray<int> val_array; val_array v1( ARRAY_SIZE ); boost::fill(v1, 0); } みたいな具合にboost:range関係をvalarrayでも使いたいんですが そもそもvalarray使うのが間違いってことなんでしょうか?
valarrayで使うという発想はなかった…… 明日試してみよう。今日は寝る。
valarrayにはbeginとendがないからね。 大域名前空間でいいから自分でbeginやendを定義すればいいと思う。 あとvectorみたいに要素の連続性の保証がないなら、 自前でイテレータを書いてやるのが移植性向上のためにはいいかもしれない。
StateChartは使いどころが今ひとつわかんね アレのお世話になるほど状態遷移が複雑になるならむしろ 専用のツール作って(あるいはExcel使うとか)そのツールからコードジェネレート した方が早いんじゃないかと思ったりする ひょっとして実はすごく多機能なんだろうか・・・
>>333 valarray は要素の連続性を保証してるみたいだよ。
26.3.2.3p3
任意の型 size_t の i 及び 型 size_t の j について、
i+j が非定値の配列 a の要素数よりも小さい場合、
式 &a[i+j] == &a[i] + j は真とする。
vector も今は連続性を保証してる。
23.2.4p1 抜粋
ベクトルの要素は、連続した場所に蓄えられる。
すなわち、T を bool 以外の型とし、v を型 vector<T, Allocator> のベクトルとした場合、
0 ≦ n < v.size()) となるすべての n について、
同一性 &v[n] == &v[0] + n が成り立つ。
意味がわからんならスルーしろよ
一瞬フライングスパゲティモンスターに見えた 有限状態機械だった
uBlasってboostの標準ライブラリですか?
そうだお
そそ。依存してるヘッダをプロジェクト内に突っ込んどくとそこそこインテリ化するよね。
うわ、誤爆したorz
そそそ
どうだっていいだろ せめてプログラムの事で絡めよ気持ち悪い
やっぱりvalarrayの(賢い方法での)range対応化は無理でした… そもそもこれSTLコンテナのインターフェースじゃないんですよね range関数やrangeイテレータの特殊化が組み込み型一つ一つの場合において特殊化していくような 強引なやり方でしか出来ませんでした><(といっても組み込み型に対してしか使えないから問題なさそうだけど)
部分特殊化できないの?
部分特殊化ってカリー化みたいだな・・・
だからなに
無性にカレーを食いたくなってきた
日本印度化計画が脳裏に
低所得者域は既にインド化済み。 雇用形態は真逆だがな。
>>353 日本じゃ所得に関わりなく奥さんがお弁当とどけてくれたりしないですよ
サリーさんのような嫁が欲しい
>>349 むしろカリー化を型志向言語で体現する手法がテンプレートなんじゃないのか
カリー化と引数の数は関係ないんじゃ?
関係あるだろ。自由変数が引数になる。
>>349 は全くの逆だが。
boost::ublasのmatrixって、宣言と同時に初期化できないの? いちいち mat( 0, 0 ) = 1; mat( 0, 1 ) = 2; mat( 0, 2) = 3; みたいな書き方してるとだるいし、コードが読みにくくなる・・・ Blitz++だと、 mat = 1, 2, 3, 4, 5, 6, 7, 8, 9; みたいな書き方できるけど、イテレータがビミョーらしいしorz > T_iterator is an iterator type. NB: this iterator is not yet fully > implemented, and is NOT STL compatible at the present time.
mat = 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9; みたいなのは作ろうと思えば作れそうだな。
>>362 明らかに実装不可能な = を例に出すようなおまえにゃムリだな。
= は右結合だったな・・・。 << でいいや。
右結合云々以前にoperator=はクラス外部で宣言できないから
せめてboost::assignみたいにmatrix_list_of(1,2,3)(4,5,6)(7,8,9) ってできればいいんだけど
ttp://sheepman.sakura.ne.jp/diary/?date=200605 #include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <iostream>
int main () {
using namespace boost::numeric;
using namespace std;
ublas::vector<double> v;
istringstream is("[3] (0.1, 2, 2)");
is >> v;
cout << v << endl;
}
$./a.out
[3](0.1,2,2)
これが一番よさそうかなぁ。
matrixでできるかどうかはわからんけど
>>365 誰もクラス外部での話に限定してなかったけどな。
こんなの書いてみた template <class T> class Vectorizer { public: typedef typename boost::numeric::ublas::vector<T>::size_type size_type; explicit Vectorizer(size_type size) : cur_(0), vector_(size) {} template <class T2> Vectorizer& operator&(const T2& t) { vector_(cur_++) = t; return *this; } operator boost::numeric::ublas::vector<T>() const { return vector_; } private: size_type cur_; boost::numeric::ublas::vector<T> vector_; }; 使い方 ublas::matrix<int> m(Vectorizer<int>(3) & 0 & 1 & 2); // m = [3](0,1,2) コピーが発生するから効率は良くない・・・RVO的なものが効くかも知れないけど rvalue-referenceが欲しいところ
最適化なら・・・最適化ならきっとなんとかしてくれる・・・!!
Visual Studio 2005 で IntelliSense がきかねぇよ・・・ しかも特定のライブラリ使ったときに顕著。 っていってたやつですが、using 使うと結構回避できるんですね。 boost::filesystem::path とか boost::spirit::file_iterator とか がそれなんですが、 using boost::filesystem::path するとか using filesystem=boost::filesystem すると IntelliSense が 効くみたい。
>>373 おお。
あれから(初版)だいぶboostも進化したし、時代遅れになってたから
そろそろ新しく書いてくれないかと思ってたところなんだ。
これは買おう。
boostそのものより、その実装に使ってる技術(とその理由)を解説したものってないのかなぁ shared_ptrのchecked_delete でさえ何でこんな事してんの?? とさんざん悩んだよ よく読むとドキュメントに書いてあったけど、書いてないものもあるし・・・
ああ、確かにそういう本欲しいなあ。 boostを題材にModern C++みたいなことをしてくれる本
そんなニッチな本売れねーよ
俺も欲しいけどなあ、そんな本。 使い方の解説はWeb上にたくさんあるけど、仕組みまで解説したところはほぼ皆無だし。
C++の本自体もうあまりでねーだろうが・・・
方向性がどんどんマニアックになってるからね。 素人向けしない仕様・思想がてんこもり
383 :
デフォルトの名無しさん :2007/07/08(日) 04:21:56
いわゆる Smalltalk 系の OOP が好きな奴は C# とか Java とか Ruby でいいと思うよ。 C++ はどんどんマニアックになってほしい。
>>373 秀和の本って紙が厚くない?
もちっと薄い紙にしてほしいけど単価高いのかなぁ。
最近のコンパイライには tr1 名前空間以下にいろいろと 用意されているの?
お化けのqueue太郎が復刊されるらしいね
blogに内部構造の話書こうかと思ったけど、 解読している時間が少なくなってしまってもったいないんだよね。 持続してblogに技術話書き続けている人って本当にすごい。
>>387 自分のメモ程度の物でいいんじゃないの?
そういうサイトも結構役に立つんだよね、暗中模索しちゃったときとか
ニヤッっとした
>>373 気がついたらLet's Boostの内容も更新されてるな
TR2もboost関連なの?
恐らくboostが一番早いだろう なんたってboostだから
じゃあ次期次期ライブラリはboooostだな
検索結果じゃあるまいし
ヘッダが増えるほどoが増えるのか?
boooooooooostよりは増えないんだぜ?
正直、ロゴの文字数が増えて、それが各ページに対応しているってインターフェースはどうかと思った
boost::ptr_vectorにはコピーコンストラクタやoperator=が無いようですが どういう理由でコピー不可になってるのですか?
goooogle
多分内部でMovePtrなんか使ってるからだお
>>398 全ての要素がboost::ptr_vectorのデストラクタでdeleteされるから。
つまり管理の最適化のためにboost::ptr_vectorがすべてのオブジェクトの所有権を独占してる。
だからコピーで二重にオブジェクトを所有できたらおかしいだろ?
>>401 ポインタだけをコピーするのがダメなら、全ての要素をnewしてコピーするという実装もアリだと思うんだが
そうしない理由もあったりするんかな?
安全なclone()が実装されてるとは限らないじゃない
しかし安全なclone()が実装されているとしよう
class Base { protected: ~Base ( ) { } }; class Derived : public Base { public: ~Derived ( ) { } }; void test1( ) { Base* p = new Derived( ); delete p; // 当然ながらコンパイルエラー } void test2( ) { boost::shared_ptr<Base> p( new Derived( ) ); // コンパイルが通る } デストラクタがprotectedな基底クラスのポインタをdeleteすることはできないが、 shared_ptrに渡してやると何故かコンパイルが通るうえに正常にデストラクトされてるようだ。 これはどうしてなんでしょうか? ちなみにVC++2005です。
>>407 うむむ、boost::shared_ptr<void> 恐るべし。
boost::shared_ptr<boost::any>
410 :
デフォルトの名無しさん :2007/07/11(水) 13:04:01
boost::any って当然 typeinfo 使うことが前提ですよね? というか、boost 全般にわたって RTTI がつかえることが 前提として設計されているんでしょうか?
RTTIが使えなければC++ではない
412 :
デフォルトの名無しさん :2007/07/11(水) 15:25:26
>>410 anyは流石にRTTIなしではまともに使えないけど。
shared_ptrやfunctionなどはRTTIなしで実装されていると思う。
例えそうでなくてもRTTIを使わない実装なんて容易に作れるし。
じゃあ作ってみて
boost::variant使えよ
RTTIなしで実装できるものが増えたらそれをRTTI代わりのライブラリにまとめればいいんだ そしてそれを標準化すればそれがRTTIに
417 :
デフォルトの名無しさん :2007/07/11(水) 23:35:00
spirit使ってる人いますか?
>>419 struct functor_thunk_base
{
virtual void operator ()() = 0;
};
略
private:
shared_data(functor_thunk_base* deleter) : count(0), deleter(deleter) {}
~shared_data() {(*deleter)();}
unsigned count;
boost::scoped_ptr<functor_thunk_base> deleter;
ここまで見て、間違ったプログラムだと判明したので見る気なくした。
カウンタ共有しないのかよ
423 :
デフォルトの名無しさん :2007/07/12(木) 23:44:23
Preprocessor読んでるんだが、 MSVC向け条件コンパイルの理由が分かる香具師いる? # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() # define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b) # else # define BOOST_PP_CAT(a, b) BOOST_PP_CAT_OO((a, b)) # define BOOST_PP_CAT_OO(par) BOOST_PP_CAT_I ## par # endif # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() # define BOOST_PP_CAT_I(a, b) a ## b # else # define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(a ## b) # define BOOST_PP_CAT_II(res) res # endif # # endif
ブートキャンプスレと聞いてやってきました
>>423 条件コンパイルをしてるのはVCのプリプロセッサが腐ってるからだが、
どのように腐ってるか知りたいってこと?
実例見つけた。 「4」と出力されるべきだが、VCだと「MYMACRO()」と出力される。 # define CAT_I(a, b) a##b # define CAT(a, b) CAT_I(a, b) # define STRINGIZE_I(x) #x # define STRINGIZE(x) STRINGIZE_I(x) # define MYMACRO() 4 # include <iostream> int main() { std::cout << STRINGIZE(CAT(MY, MACRO())) << "\n"; }
>>427 tnx.
こっちも、やみくもにいろいろやってみたが、
引数付きマクロに展開されるマクロをネストしまくると、
展開しきれたり、しきれなかったり、法則がよく分からなかった。
コメントが無いのは説明が面倒過ぎるんだろうな。
VC8でも試したが、直ってなくて萎えた。
というか、それはVCの場合、仕様になっている。 その振る舞いに依存しているシステム提供ヘッダが多すぎて直せない。
へえー。 じゃあせめてプリプロセッサの挙動を互換モードと標準モードで切り替えられるような pragmaディレクティブを用意して欲しいもんだな。
いやコンパイルオプションにしてくれよ
だからコンパイルオプションで一括にしちゃうと _oooo.h とか xooo.h とかがシボーンしちゃうってことでしょ
定義時にどっちのモードかフラグ付けておいて、 選択的に展開しないと駄目だよな。 展開時にはシステム定義、ユーザ定義が混合しているから。
Linux で以下のように release かつ dynamic のライブラリをビルドしようとすると debug と static の組み合わせもビルドして大量のライブラリができるけど,どこが 間違っているでしょうか? Boost は 1.34.0 です。 ./bjam --toolset=gcc --prefix=/usr/local -sBUILD="release <runtime-link>dynamic" --with-regex install
>>435 Boost.BuildがV2になったんで-sBUILD消滅
<hoge>hageをhoge=hageにしてオプションとして渡せばおk
>>436 ありがとうございます。
早速試してみます。
↓remove_referenceのMSVC実装が極悪非道過ぎて吹いた // This uses nice VC6.5 and VC7.1 bugfeature
type_ofのVC7.1、VC8実装もみてみろ
boost使いの人ってlispもマスターしてるんですか? MPLが他の言語で生成されたと聞いて、ちょっと興味あるのですが
使いこなせる人もいるだろうし、授業で習った程度の人もいるだろうし、名前だけは知ってるって人もいるだろう。 あまり意味のある質問とは思えん。 boostユーザを十把一絡げにしすぎ
授業でboost!! なんて大学だ、紹介してくれ
Lispの話だろ。
そうか、早とちりしてゴメソ
445 :
デフォルトの名無しさん :2007/07/19(木) 00:44:34
Visual C++ 2005 Express EditionでSTLport-5.1.3と一緒にBoost1.34.0をビルドしようとしているのですがうまくいきません。 STLportの変更箇所はSTLport-5.1.3/stlport/stl/config/user_config.hに#define _STLP_USE_BOOST_SUPPORT 1を追加しました。 ビルドは成功しました。 Boost側の変更箇所はboost_1_34_0/tools/build/v2/user-config.jamに using stlport : : C:/build/lib/STLport-5.1.3/stlport C:/build/lib/STLport-5.1.3/lib ; と追加しました。 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.batに @set INCLUDE=C:\build\lib\STLport-5.1.3; . . . @set LIB=C:\build\lib\STLport-5.1.3\lib; . . . と追加した後、実行しました。 上記を実行したコマンドプロンプトで bjam toolset=msvc-8.0express stdlib=stlport release debug threading=multi link=static link=shared runtime-link=static runtime-link=shared --without-python stage を実行しました。 エラーメッセージは .\boost/mpl/integral_c_tag.hpp(22) : error C2061: 構文エラー : 識別子 'value' .\boost/mpl/integral_c_tag.hpp(22) : warning C4183: 'BOOST_STATIC_CONSTANT': 戻り値の型がありません。'int' を返すメンバ関数とみなします。 というBOOST_STATIC_CONSTANTがマクロではなく関数みたいに認識されてしまう感じのと .\boost/type_traits/is_integral.hpp(60) : error C2039: 'ulong_long_type' : 'boost' のメンバではありません。 と型が定義されてない系のものが得られました.。 試しに以下をコンパイルしてみたのですが、こちらは成功しています。 多分パス周りの設定が間違ってるんだと思うのですが、どこを直せばいいかわかりません。 よろしくおねがいします。 #include <iostream> #include <boost/config.hpp> struct foge { BOOST_STATIC_CONSTANT(int, value = 0); }; int main(int ac, char** av) { std::cout << sizeof(boost::ulong_long_type) << foge::value << std::endl; return 0; }
>>442 東大あたりの研究室サイトに学生向けboost解説ページがあった気がする。
授業でboost、遠くない日に来るのかも。
javaはlispで生成できるけどc++は大変ってどこかに書いてあった気がする なんで大変なんだろ
別に普通の道具だから、授業で使っても変じゃないでしょ。 わざわざ「Boostの授業」とかあったら変わってるなと思うけど。
まずはprogress_displayの使い方の講義から
そんな講義受けてると将来rejectされるぞ
STLのアルゴリズムよりboost::range_exのアルゴリズムの方が使いやすいよとか 生ポでなくスマポを使いましょう→STLにはauto_ptrがある→でもこれは色々と駄目→ だからboost::shared_ptr、weak_ptrを使いましょう とか授業でも使えるネタも一杯あると思いまス
mplの内部構造をマスターしないと単位が貰えません
ビルドすらできていない445は落第決定
>>445 bjam --help
Important Options:
* --clean Remove targets instead of building
* -a Rebuild everything
* -n Don't execute the commands, only print them
* -d+2 Show commands as they are executed
* -d0 Supress all informational messages
* -q Stop at first error
* --debug-configuration Diagnose configuration
* --debug-building Report which targets are built with w
* --debug-generator Diagnose generator search/execution
std::vector<std::string> vec; boost::range_iterator< BOOST_TYPEOF(vec) > iteraor; のように(これはエラーになりますが) エンティティーから取得した型をテンプレート引数にしたいんですが方法はありますかね?
multi_array のイテレータの使い方がわかんない。 multi_array<double, 2> array( extents[ 5 ][ 5 ] ); multi_array<double, 2>::iterator ite = array.begin(); cout << *ite; で配列の要素を出力できるのかと思ったら、上手くいかなかった。 これどうやって使うものなんです?
Formal Review で Accept されるまで単位は無しな
Boost Book 2nd買ってきた
461 :
445 :2007/07/20(金) 16:48:43
>>453 orz
stlport無しだといけるみたいなのでstlport無しでいくことにしました。 ありがとうstlport、そしてさよなら
_STLP_USE_BOOST_SUPPORT無しでやってみるという発想はないのか
463 :
445 :2007/07/20(金) 23:49:27
>>462 ちょwwwwwwwwwwww その発想なかったwwwwwwwww 今ビルド中なのですがいけそうです
_STLP_USE_BOOST_SUPPORTなんてもっともな名前つけてあったので。。。 罠だったのかorz
www多すぎだろ・・・
>>463 の脳内では文字列バッファをwで初期化してるに違いない
なんかバグ出力させたときとか、デバッガで見たときにイラっとしそうなやつだな
フフフフフじゃなくてwwwwwになるのか
tokenizer で分割された個数を調べる方法はありますか?
分割されたものを逐一コンテナに放り込んで行って、終了時にsze()でおk
470 :
468 :2007/07/22(日) 19:56:07
そうします。 end()-begin() はできないし size() も tokenizer には、ないので、何か便利な方法はないかなぁと思っていました。
tokenizerのイテレータとカウンタを内蔵するオブジェクトを作って、そいつのインクリメント演算子でイテレータと カウンタを同時にインクリメントするようにして ループ内でそいつをインクリメントするのはどうだろう
そうですか… なら手軽でシンプルな分そっちの方がいいっすね
tokenizerにはなんというかロマンが無いと思います
しかしspiritのごときロマンを盛り込まれても困る spirit好きだけどね・・・コンパイル重いんよね・・・
そういやspirit2はどうなったんだ?
マルチバイトを扱えるイテレータが欲しい
>>471 俺も思ったけど既存のコンテナに突っ込んでsize()するよりも利点を見出せない
コンテナに突っ込んだら無駄にメモリ食わね?
本当に数えたいだけならdistance使うだろ
イタレータはないのにか?
なんのこっちゃ
483 :
468 :2007/07/24(火) 01:55:56
boost::iostreamsをちょっと試しているのですが、 filtering_ostream/filtering_ostreambufのバッファリングモードを 変更する適切な方法はありますか。 試した感じでは、デフォルトでフルバッファリングされ、 pubsetbuf(0, 0)を実行しても、バッファリングなしの動作にはならないようです。 boost::iostreams::flush()で強制フラッシュさせることは可能なようですが、 あまり美しくない気がします。
485 :
468 :2007/07/24(火) 17:20:14
distance を使うのに iterator をインクルードするのが普通でしょうか? xutility を include するのは推奨されないのかな。・。。 distance の実装 _Distance2 を見て少しがっかりしましたけど。。。これを使います。
>>485 <iterator>をインクルードするのが普通。
こっちが標準ライブラリで規定されているヘッダだから。
ランダムアクセスイテレータ以外でのdistanceが
ああいう実装になるのはどうしようもない。
advance/distanceはそれを理解した上で使う存在だよ。
487 :
デフォルトの名無しさん :2007/07/25(水) 10:24:54
Boost 1.34.1 age
現存が確認されている「王子」 一覧
・ハンカチ王子 (斎藤佑樹、野球)) ・ハニカミ王子 (石川遼、ゴルフ)
・ハナクソ王子 (平山相太、サッカー) 以上「業界三大王子」
・ポッチャリ王子 (古田幸希、ゴルフ) ・ドリブル王子 (鈴木修人、サッカー、早稲田の修ちゃん)
・筋肉王子 (長友佑都、サッカー) ・トンカチ王子 (ヴァージニア工科大学銃乱射犯、故人)
・イルハン王子 (イルハン) ・有限会社王子 (商業手形割引を中心とした総合ファイナンス会社)
・海パン王子 (小島よしお、お笑い) ・スベスベ王子 (デイブ・スペクター、お笑い)
・ウィリアム王子 (英国) ・カミカミ王子 (畠山智之、NHKアナウンサー)
・ヘンリー王子 (英国) ・監禁王子 (小林改め石島泰剛、容疑者)
・八王子 (市、東京都) ・謝罪王子 (福澤朗、フリーアナウンサー)
・広井王子 (詳細不明) ・バンダル王子 (戦闘機売却契約裏金疑惑、サウジアラビア)
・若王子 (人質、故人) ・パンダ王子 (宮本レッドブル恒靖、広告塔)
・ハコダテ王子 (藤岡佑介、騎手) ・アドリブ王子 (パチスロ漫画、あかつきけいいち・作)
・元王子 (及川光博、ミッチー) ・アジム王子 (マイケルに12億のギャラ、ブルネイ)
・ハローワーク王子(東京労働局職業安定部職業安定課、東京都北区王子、
http://www.ouji.hello-work.jp/ )
・はに丸王子 (はにわ、NHK) ・ニセサツ王子 (津幡勝容疑者、王子製紙社員)
・タイのハニカミ王子(アイス・サランユー、タイ歌手)
489 :
デフォルトの名無しさん :2007/07/25(水) 19:15:20
Boost本の二版が出てた asioのとこだけ立ち読みしてきた
asioってオーディオの?
本田のロボット
P2がどうしたって?
Vista+Visual Studio2005Expressで asioを使おうとしているのですが、うまくいきません。 boost_asio_0_3_8rc3.zip というのを公式サイトからDLしてきて、 解凍してできたboostフォルダをそのまま boostのインストールフォルダに突っ込みました。 で、以下のコードをビルドするとエラーになります。 #include "stdafx.h" #include <boost/asio.hpp> int _tmain(int argc, _TCHAR* argv[]) { return 0; } このコードをコンパイルしようとすると 「1>Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately 1>Assuming _WIN32_WINNT=0x0500 (i.e. Windows 2000 target)」 といわれたあと、 「'.Byte' の左側はクラス、構造体、共用体でなければなりません 型は 'const u_char' です。」 といったエラーがずらずら出たので、 #define _WIN32_WINNT 0x0500 としてみたのですが、今度はPlease define _WIN32_WINNTなんたら というのは消えたのですが、他のエラーは消えません。で、試しに #define _WIN32_WINNT 0x0502 とするとコンパイルできました。しかし、リンク時に
「1>リンクしています... 1>test00.obj : error LNK2019: 未解決の外部シンボル "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall boost::system::error_code::message(void)const " (?message@error_code@system@boost@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) が関数 "public: virtual char const * __thiscall boost::system::system_error::what(void)const " (?what@system_error@system@boost@@UBEPBDXZ) で参照されました。 1>C:\Users\ore\Documents\Visual Studio 2005\Projects\test00\Debug\test00.exe : fatal error LNK1120: 外部参照 1 が未解決です。」 となってしまいます。コンパイル時のコマンドラインの追加オプションには /DBOOST_ALL_NO_LIB をちゃんと指定しているのですが…
asynchronous I/O で asio か ASIOと紛らわしいな
>>497 今の今までオーディオの方だと思ってスルーしてた・・・
>>498 warosu.
紛らわしいからそのうち改名されるかもな
asioはACEとかよりboostライクでカッコよさげだが、
機能的にはどうなんだろ
今のところネットワーク周りだけみたいだけど、 その内その名の通りI/Oを全体に適用してく野望があるらしい
asio銅山
VC++2005STDのアンマネージドコードでBOOST_FOREACHを使うとなぜかリンクエラー。 同じトラブルではまった人いませんか? [A] <-- [B] <|-- [C] 上記のようなクラス構成で、[A]と[B]でBOOST_FOREACHを使ってます。 エラーメッセージはこんな感じ。 1>C.obj : error LNK2005: "public: static bool const boost::type_traits::ice_not<0>::value" (?value@?$ice_not@$0A@@type_traits@boost@@$$Q2_NB) は既に B.obj で定義されています。 以前は[A]と[B]だけしかなかったのですが問題なく動作しており、 [C]を追加したらリンクできなくなりました。 [C]ではBOOST_FOREACHを使ってません。 ちなみに[A]と[B}のBOOST_FOREACHを削除して、 普通にイテレーターでループを回すように直すとうまく動作します。。
505 :
504 :2007/08/01(水) 14:39:43
[C]で使ってたptr_mapをstd::mapに改めたらなぜかリンクエラーが出なくなりました。 謎だ…。
【C++】STL(Standard Template Library)相談室 7 の新スレってまだ立ってない?
立っている
そもそも既存のC++スレで足りると思う。 まあこんなところにそう書いたところで、 その内誰か立ててしまうのだろうけど。
C++はプログラマのレベル差が激しいから、スレも細分化したほうがいいよ
>>511 個人的には、
C++でのTemplate metaprogrammingのスレもあってもいいんじゃないかと思ってる。
それこそ過疎りそうだけど・・・
どうなんでしょ?
read_write_mutexってリリース中止になってたorz 昔書いたコードがビルドできなくて、boost/thread/read_write_mutex.hppが無いって言われたから Debianのパッケージが腐ったかと思ったよ・・・。
svnへの移行が混乱している件について
>>512 過去実際に存在した
でご想像のとおり過疎ってた
(ただム板的には普通のスレ速度だったような)
VC2005でxml_oarchiveを使うとdbgheap.cの_CrtIsValidHeapPointerで落ちてしまいます。 コードは以下のような感じ。ちなみにEXEではなくスタティックライブラリです。 どなたかヒントを下さい…。 コードはこんな感じ。ライブラリはマルチスレッドで/MDdオプション付けてます。 #define BOOST_LIB_NAME boost_serialization #include <boost/config/auto_link.hpp> #include <fstream> #include <boost/serialization/map.hpp> #include <boost/serialization/nvp.hpp> #include <boost/archive/xml_oarchive.hpp> std::map<std::string, int> MyClass::myObjects; void MyClass::SaveToFile(const std::string &filename) { ofstream file(filename.c_str()); xml_oarchive oa(file); oa << make_nvp("myObjects", myObjects); }
単体で動くテストプログラムのソースをうpろだでも使って挙げてくだされば 多少は協力できる人も出てくるかもしれませんよ
518 :
516 :2007/08/03(金) 20:44:47
どうもです。 いちおうかなり無理矢理ですができました。 どうやらboostのwindows版に標準添付されているlibファイル群は、 マネージドとアンマネージドの混在環境に対応していなかったようです。たぶん。 libファイルのプロジェクトをソリューションに追加して、/clrオプション付きでリビルドして、 元から提供されているライブラリをリンクしないように細工することでようやく動作しました。 もしかしたらもっとうまい方法があるのかもしれませんが、 ゲーム屋なのでWindowsのプログラムには慣れておらずよくわかりません。 それにしてもこのやりかたは非常に面倒ですね。 /clrオプション付きでビルドしたlibファイルも標準添付してくれると助かるのですが…。
ちなみに#prgama unmanagedと非clrなlibだとどこまでいける?
520 :
516 :2007/08/03(金) 22:01:30
もう帰宅してしまったので試せませんが…。 ちょこっとだけ#pragma unmanagedを使ってみた限りでは効果がありませんでした。 もし効果があったとしてもpragmaの嵐になりそうな予感。 ちなみにassertの発生箇所は、freeしているところではなく、 staticなオブジェクトがプロセス終了時にデストラクトされるように、 atexitに登録しているところでした。 ということはユーザーコード側のnew/freeのタイミング調整では回避できないということです。 素直にclrなlibを作ったほうがよさそう。
521 :
516 :2007/08/03(金) 22:07:55
>staticなオブジェクトがプロセス終了時にデストラクトされるように、 >atexitに登録しているところでした。 わかりづらい説明だったのでちょっと補足。 if(NULL == m_self){ static tkmap instance; m_self = & instance; } 上記のコードでinstanceがプロセス終了時にデストラクトされるように、 コンパイラが内部でこっそりatexitを呼び出すコードを出力しています。 そこであぼーんしてしまうと。 ここはテンプレートではないのでインライン化されませんから、 結局pragmaでは回避できないと思います。
ところでboost::functionで、コンパイラによっては boost::function<void (int,int,DWORD)> みたいな書き方できるようになっているけど、これと同じ書き方できるようにする場合、template引数どういう風に記述すればいい? boost::functionのソース呼んでみたけど、この書き方できないコンパイラ対策のマクロがごちゃごちゃしててよくわからなかった・・・
template<typename FunctionType> struct function;
523の書き方でもいけるけど、 boost::functionの場合は、引数の数違いで部分特殊化している。 template<typename R, typename A1, typename A2, typename Allocator> class function<R (A1, A2)> : public functionN<R, A1, A2> これを引数の数だけプリプロセッサで対処している。
v1.34.1なのですが。 boost/iostreams/detail/streambuf/linked_streambuf.hppで定義されている BOOST_IOSTREAMS_USING_PROTECTED_STREAMS_BUFFER マクロに C++標準のbasic_streambuf<>ではpublicであるsputcがなぜか紛れ込んでいるせいで private送りになってしまい、 boost::iostreams::stream_buffer<>でsputc()が使えないみたいなんですが、 これはバグですかね。最新のバージョンでは直ってるんでしょうか。 まあ、ヘッダのマクロを修正したら一応使えるようにはなったんですが。
>>525 リポジトリ確認してみたら?
直ってなければ Trac へ。
>>526 SVN見てみたら二年間全くいじられてないヘッダのようだったので
レポあげてきた。
単に誰も使ってない、のか?w
>>527 stream_bufferを使うシチュエーションってどんなの?
530 :
516 :2007/08/06(月) 12:27:09
ようやくちゃんと(?)解決できました。 C++/CLIでアンマネージドなオブジェクトファイルをリンクすると、 スタティック変数の初期化時にassertする問題がVC8にあり、 boostに限らずMFC等のライブラリをリンクするときもよく問題になっているようです。 そしてエントリポイントを?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z に書き換えてしまうのが一番簡単な解決策のようです。 518の方法でもたぶん大丈夫だとは思いますが、こっちのほうが簡単でしょう。 これはVCの問題ですが、同じ理由でboostが使えず困っている人も多いと思うので、 情報としてあげておきますね。
C++/CLIって・・・・C++.NETに何でしないのさ・・・・
それだと純正のC++でmanagedコードが書けちゃうかの様な誤解を招くからじゃね
もうC++じゃないんだから、別の名前にしてほしかったな。C+++とか。w
いや寧ろ、C#-だろ。
>>531 ECMAへ提案する都合上、.NETというマイクロソフト色の強い名前を避けたのではないかな
C丼
バグ利用のnative typeofがorcasでは見事に使えなくなってて笑った 本物のtypeof拡張が用意されてんのかな?
541 :
デフォルトの名無しさん :2007/08/09(木) 19:58:48
boost ublasのvectorには すべての要素を一度に代入or初期化する関数は用意されていないのでしょうか? //このような風に書きたい boost::numeric::ublas::bounded_vector<double,3> v; v.set(1,2,3); //これはできるのですが・・・ v(0)=1; v(1)=2; v(2)=3;
C++0xになったらこう書けると思う。たぶん。きっと。 boost::numeric::ublas::bounded_vector<double,3> v = { 1, 2, 3 };
Blitzみたくカンマ演算子をオーバーロードでなんとかならないかな?
Cは昔から使っているのですが C++を最近やり始めたものです たぶんFAQだと思うのですが stringを使おうとして #include <string> using namespace std; int main(int ac, char **av) { string s; sprintf(s.c_str(), "abc %d", 10); printf(s.c_str()); return 0; } みたいに使おうとしてもうまくいきません。 sprintfはないのでしょうか?
std::rope
>>544 ここはboostスレ。C++初心者スレへどうぞ。
最近は初心者がBoostスレにまぎれこんでくる時代なのか…
>>549 おお!それです!!
ばっちり間に合いました!!!
ありがとうございます!!!!!
auto変数で boost::ptr_vector<string> fuga; fuga.push_back(new string("hage")); のような使い方をする場合 fugaのスコープから抜けたときに string * が指しているオブジェクトも消去されますか?
される 安心汁
というかそれを実現するためのコンテナなんじゃないかと…
質問なんだけど、 一生無いと思うけど、boostに投稿するときってどうやるの? 興味で知りたいんだけど。
557 :
556 :2007/08/15(水) 16:55:53
新作のことね。
寝言は寝て言え
559 :
556 :2007/08/15(水) 17:15:00
560 :
デフォルトの名無しさん :2007/08/15(水) 17:23:08
作ってから言え
donutのお父さんでもsandboxにすら入ってないんだぜ…
メーリングリストで紹介すればいいんじゃない?
regex を使いたくて Boost をインストールしました。 これを利用して、Boost をインストールしていないPCでも実行したいのですが; VS2005 でどのようにすればスタティック・リンクできますでしょうか? 教えてください。よろしくおねがいします。
デフォルトでスタティックリンクする。 boostのdllにパスを通さなくても動くからね。
Expressiveなら確かコンパイルすら要らなかったような
xpressiveな。ヘッダファイルだけだよ。
ググって見つけた以下のコードをコンパイルしたら; str が boost::io のメンバじゃないって怒られてしまうのですが; str は、ないのしょうか? #include <boost/io/ios_state.hpp> std::string buff; buff = boost::io::str( boost::format(mystr) % 10 % 0.01f % 0xff % 'a' % "sprintfみたいに使う!" );
#include <boost/format.hpp>
570 :
568 :2007/08/17(金) 21:23:54
>>569 ありがとうございます。できました。
今度は、gzip, zlib 関連のライブラリーが作成されていないんですけど;
インストール時に何か指定が必要だったのでしょうか?
こうして質問責めの無限ループに突入するんだろうなぁ
>>570 「Boost C++ Libraries プログラミング 第2版」に書いてたはずだからとにかく読んでこい
573 :
568 :2007/08/19(日) 00:37:46
575 :
568 :2007/08/19(日) 16:18:37
>>574 なるほど、、どっちにしろ zlib が別個に必要なんですね。
そこまで含めてスタティックにリンクしてくれるとうれしいんですが・・・
Boostなんてたいしたこと無いだろ これが一番典型的な例 ____ progress_ |← reject| boostの中の人 display ユーザー . ̄.|| ̄ ̄ ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=- || ┏┗ ┗┗ ┏┗ ≡=-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
6月か7月あたりから404になったねぇ。 東京大学のヤスなんちゃらさんが卒業したか転職したか 引き抜かれたか飛ばされたかしたんじゃない?
wget -m しといて在る意味よかったかも。 AirH゛なせいで夜中にwgetとかよくやる。
multi_arrayで2次元目の配列の要素の数を取り出すにはどうすればいいのでしょうか? vector<vector<double> > hoge; int second_dim_length = hoge[8].size(); みたいなことをしたいのですけど。
boost::multi_array<double, 2> hoge( boost::extents[8][8] ); hoge[8].size();;
>>582 ptr_vector だぞ。内部スマートポインタで解放されなかったらダメだろ
シリアライズを使ったらプログラムが300Kも増えました。 あと、最後に .lib .exp を作成しだしました。 <--- これは止められないのかな?
>シリアライズを使ったらプログラムが300Kも増えました。 どこかのスレのテンプレみたいでにやっとしてしまった
全角が間抜けさを強めてるな。 全角って何ですか? "いわゆる全角"のことではないでしょうか。
UNICODEのFULLWIDTH何とか文字の事だろう。
そういや「全角」って言い回しがUnicodeにも引き継がれてるんだな…
全角の全とか角とかの語源知ってる人いますか?
写植用語じゃね?
ワープロ用語かと思ってた 二倍角とかそういうのなかったっけ
ワープロ用語です 「全」は半角に対する語 なんで「角」なのかは知らない
今の若い人は4倍角なんて知らんだろうな
半角漢字とかもあったなあ
MS Wordでフォントサイズと文字幅の指定を使って 縦倍角や横倍角を再現する方法は、ググればわりと見付かる。
再現して嬉しいかってなもんではあるけどな……
NEC拡張の文字に半角ひらがなとかもあるよ。
boost::archive::binary_oarchive ってSJISだと漢字や\問題がでて書き込めるけど、読み込み時にバグるんですね。。 せっかくバイナリなのに? 参った。
UNICODEの時代に全角と半角の区別すること字体がおかしいって言ってるひといるけど AとAはやっぱり違うだろ?
区別しないとAA書く時に困るしな。
URL偽装できないしな。
>>600 倍角の A とか4倍角の A とか、イタリック体の A とか全部違うコードだったら厭だろ?w
個人的にはフォント指定等で区別してほしかったな。今となっては手遅れだけど。
同じAなのに何種類もコードがあるほうがもっと厭
同じAではないけれど A a ÀÁÂÃÄÅ ǞǟǠǡ Ǻǻ ȀȁȂȃ Ά Α Α α А а
工エエェェ(´д`)ェェエエ工工
AΑАA 左からいわゆる半角、ギリシア文字、キリル文字、いわゆる全角。 元々同じ文字だけど全部違うコード。
IMEで「リ」を変換しようと候補を出すと 候補一覧のひらがなの「り」のフォントが 実際に出てくる文字と違うんだけどなんで?
MS UI Gothic では左右がくっついたグリフが採用されているから 文字自体は同じもの
何この文字コードスレ?
boost VS2008対応いつ? 悲しいことにテンプレート周りのバグが修正されているようなので ネイティブtypeofが実現できるのか気になるなあ
コンパイラだけ2005の使うとかw 意味ないか
613 :
デフォルトの名無しさん :2007/09/02(日) 21:05:19
あるクラスへの shared_ptr をとるような関数に、 静的に確保されているインスタンスのポインタを渡したいときって、 どうすればいいんでしょうか? //静的に確保されている myclass のインスタンス //MyClass はデフォルトコンストラクタを持つ static MyClass myclass; //MyClass のインスタンスを shared_ptr として受け取る void func(boost::shared_ptr<MyClass> p){ p が指す MyClass のインスタンスに関する処理 } myclass が delete されちゃったりするのでしょうか?????
614 :
デフォルトの名無しさん :2007/09/02(日) 21:07:41
インデントがおかしくなっちゃったので書き直します。 //静的に確保されている myclass のインスタンス //MyClass はデフォルトコンストラクタを持つ static MyClass myclass; //MyClass のインスタンスを shared_ptr として受け取る void func(boost::shared_ptr<MyClass> p){ //p が指す MyClass のインスタンスに関する処理 } int main(int argc, char** argv){ func(myclass); return EXIT_SUCCESS; }
615 :
デフォルトの名無しさん :2007/09/02(日) 21:24:10
前のレス、激しく間違ってるね・・・それはおいといて class DoNothing { public: void operator()(void const * x) const {return;} };//DoNothing みたいに何もしないファンクタを作っておいて、 DoNothing do_nothing; int main(int argc, char** argv){ func(boost::shared_ptr<MyClass>(&myclass, do_nothing)); return EXIT_SUCCESS; } ってすればいいのかな?
boostにcalendarクラスってありますか?
#include <boost/date_time.hpp>
libboost_date_time-vc80-mt-1_34_1.lib が無いと言われます
vc80はまだだめだろ
623 :
615 :2007/09/03(月) 08:38:06
>>616 おお、ちゃんと解説しているページがあるじゃないか・・・
何もしないファンクタくらい boost:: 名前空間内に
用意しておいてくれればいいのになぁ。
ところで、リファレンスの日本語訳開くとき必ず文字化けするんだが俺だけか?
filesystem って日本語のファイル名やディレクトリ名使っても問題ないですか?
>>624 俺も。見るたびにエンコードをEUC-JPにしてるが面倒くさいな。
>>624 HTTP bodyがEUC-JPなのに、HTTP headerはUTF-8指定なんだな。
修正して欲しいなあ。
apacheのデフォルトがあれだからな・・・・
ディレクトリ名の末尾が「表」とかだと見事に落ちました ほんとうにありがとうございました
OSが落ちた?まさかね
うひょー!
leafが悪さしてるみたい
(^∀^)ゲラゲラ
Visual Studio 2005 のスレッドから誘導できました。ちら裏ですが、 namespace fs = boost::filesystem; だと IntelliSense が働きませんが、 namespace fs { using namespace boost::filesystem;} だと IntelliSense が働きます。
anonymous unionをstructで囲ったりとか
unionじゃなくてenumね あんっ あ
639 :
デフォルトの名無しさん :2007/09/06(木) 10:52:38
「タグ名::」と入れてインテリ扇子を振るとenum内容が出てくる
boost::gilの、 pixel::operator[]で pixel[0]; ってふうにアクセスするのと、 semantic_at_c<0>( pixel ); ってアクセスするのでは何が違うのかわからん。。。 わかるヒトいる?
こんなのあるんだねぇ。知らなかったよ。 operator[]が動的にアドレスを計算するのに対し、 semantic_at_cのほうはオフセットが静的に展開されるという違いがあるかと。
色気が違う
typedef std::istreambuf_iterator ifsb_iterator; BOOST_AUTO(ifsb_rng, boost::make_iterator_range( (ifsb_iterator(ifs)), ifsb_iterator() ) ); BOOST_FOREACH ( char i, ifsb_rng ) {} というようなコードについて >error C2440: 'return' : 'char' から 'char &' に変換できません というエラーでコンパイル通りません@VC2005 for (ifsb_iterator i = file_rng.begin(); i != file_rng.end(); ++i) {} のようにforループに展開すれば使えるのですが。。。 原因や解決策がわかる方、どうかお力添えをお願いします
すいません解決策はありました ovenのstream_read
系を使えばいいようですが、原因はやはりわかりません
BOOST_FOREACH ( char &i, ifsb_rng ) {} これじゃぁだめやろか?
>>647 istreambuf_iterator<>::value_typeが参照型でないことが直接の原因だと思う。
const参照ならコンパイルできるのではないかと思った。
そこで試しにvalue_type/pointer/referenceをconst付きの型にしたアダプタを作ってみたが、
「C4172 ローカル変数またはテンポラリのアドレスを返します。」という警告になってしまった。
そういう問題ではなかったOTL。
652 :
デフォルトの名無しさん :2007/09/14(金) 20:37:07
boostってboost/preprocessorとか使ってるのとかあったりして、tags作りにくいと思うだけど諸兄方はどうなされてますか?
なまえくうか
>>653 kwsk
boost::iostreams::stream_bufferのコンストラクタとかopenとかみたいなののために
boost::iostreams名前空間全体を補完候補から捨てたくありません><
#include <iostream> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> int main() { namespace bll = boost::lambda; BOOST_AUTO(puts_, std::cout << bll::_1 << bll::constant('\n')); puts_("text"); bll::bind(&puts_, "text"); // (*) } この(*)の関数オブジェクトを実行するにはどうすればいいんでしょうか? bll::bind(&puts_, "text")();ではコンパイルエラーになってしまいますとです
>>655 bll::bind(bll::unlambda(puts_), "text");
でどうだ?
>>656 回答ありがとうございました
unlambda
こんなものもあるんですね・・・
もっとドキュメント熟読すべきでした
658 :
デフォルトの名無しさん :2007/09/16(日) 13:21:52
659 :
デフォルトの名無しさん :2007/09/16(日) 17:37:53
質問です。 thread-safeなシングルトンを作ろうとして、boost::threadを利用しようと してたんですが、、 class Singleton { private: static boost::mutex m_mutex; static Singleton* m_p_instance; public: static Singleton* GetInstance() { if (!m_p_instance) { boost::mutex::scoped_lock guard(m_mutex); // ← (1) if (!m_p_instance) m_p_instance = new Singleton(); } return m_p_instance; } }; (1)の時点でm_mutexのコンストラクタが呼ばれている保証がなく、 この実装は危険なものになってしまいます。 皆さんどうやってシングルトンを実現してますか?
661 :
659 :2007/09/16(日) 17:56:20
1.34 (Internationalization) Changes
http://www.boost.org/libs/filesystem/doc/i18n.html#Simplification Simplification of the path interface, including elimination
of distinction between native and generic formats,
and separation of name checking functionality from
general path functionality.
ということらしいので、boost::filesystem::path のコンストラクタ
に渡すときに native か portable かを指定する必要はないんですね。
う〜ん、しかしそんなことでパス文字列の分解とか正しくできるんだろうか。
\と/が混ざったらどうなるんやろうー
\と/、両方で区切ればいいだろ。 何か問題あるのか?
\と/と:が混ざったらどうなるんやろうー
\と/と:で区切ればいいだろ。 何か問題あるのか?
ドとレとミとファとソとラとシの音が混ざったらどうなるんやろうー
座標変換すればいいだろ。 何か問題でもあるのか?
668 :
デフォルトの名無しさん :2007/09/17(月) 08:42:52
Visual Studio 2005 ではしょっちゅう IntelliSense が 機能しなくなります。Visual Studio 2008 のベータで使って おられる方、どうですか?改善されてますか? 同じような報告が boost の ML にもあったけど、 「おめぇ、それ、boost の問題じゃないだろが、 関係ねぇメッセージ投稿してるんじゃねぇよ、禿」 って罵倒されてました。 外人オソロシス
>>668 >「おめぇ、それ、boost の問題じゃないだろが、関係ねぇメッセージ投稿してるんじゃねぇよ、禿」
同意。
まあboostの変態ぶりのせいでIntelliSenseも苦労してそうだけどね…。
672 :
デフォルトの名無しさん :2007/09/17(月) 10:08:32
プリプロセッサとテンプレートを処理するのは大変そうだもんな。 静的な変態ぶりじゃ俺も負けないつもりなんだが。
boostはboostでライブラリ出してるけど、c++の標準ライブラリと一緒に配布されるの?
はあ?
c++0xにboost(の一部)が取り込まれたらboostはどうなるのか? という意味ではないかとエスパーしてみる
いや、どうみても、progress_display等のすばらしいBoostのライブラリは、 標準ライブラリとして取り入れられるのかと聞いているだけだろ。
>progress_display等のすばらしいBoostのライブラリ すばらしいか? 便利は便利ですが個人的にはあまり面白くないです。
どう読んでも皮肉だろw
reject!!
一時期emacs(meadow)に浮気してたこともあったけど やっぱりc++はVisualStudioだね
そんなこたぁない
ちょっと質問です
VisualStudio2005上で
http://www.kmonos.net/alang/boost/classes/spirit.html ここのサンプルコードをコピペしてビルドしてみたら
1>mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\aho.exe.embed.manifest". Qia|?LUcfD~Y
っていうエラーが出てしまいます(末尾の文字化け部分もそのままコピペしてます)
ソースファイルの文字コードを変えたりしてみたのですがうまくいきません
どうすればこれ直りますか?
まさか書き込み権限がないって落ちじゃないよね。 いずれにしても、Boostの問題じゃなさそうだが。
すみません、ソリューションのクリーンをやったらきちんといけました、sorry・・・
688 :
デフォルトの名無しさん :2007/09/19(水) 21:54:49
∧..∧ ⊂(・∀・)つ-、<福田を押してるのは /// /_/:::::/ <加藤紘一、山崎拓、古賀誠 |:::|/⊂ヽノ|:::| /<日本オワタ\(^o^)/ / ̄ ̄旦 ̄ ̄ ̄/| /______/| | | |-----------| | (福田総理となるとこれから想定される事態) ・南京大虐殺を認め日本の首相として正式に謝罪しますフフン ・従軍慰安婦の方々には国として手厚く賠償しますフフン ・拉致問題は解決済みですフフン ・在日韓国朝鮮人の皆さんには生活保護と年金を漏れなく支給しますフフン ・総連への税制優遇措置も再開しますフフン ・在日韓国朝鮮人の皆さんには選挙権も与えますフフン ・2000万の中国の人たちの日本への移民を認めますフフン ・人権擁護法の成立に全力を尽くしますフフン ・中国へのODAは継続し無償技術提供もしますフフン ・中国韓国朝鮮人の方々の命は地球より重いです、日本人?なにそれフフン
690 :
デフォルトの名無しさん :2007/09/21(金) 06:56:44
string sre("[^漢示本xyz\\s\\-]+"); boost::regex re(sre); string str("xxxabcd efgh-ijklm no日本語表示申能漢字pqr st uvw-xyz."); string rep("=あ$0ほ="); string res = boost::regex_replace(str, re, rep, boost::format_no_copy); cerr << "sre: " << sre << endl; cerr << "str: " << str << endl; cerr << "rep: " << rep << endl; cerr << "res: " << res << endl; boost::sregex_iterator it(str.begin(), str.end(), re); boost::sregex_iterator it_end; for( ; it != it_end; ++it){ cerr << it->position() << ": " << it->str() << endl; }
どうして w シリーズでやらないのですか?
wchar_t版のregexはバグ持ってるらしい
がんばれおれの IntelliSense がんばってテンプレートも果敢に解析してくれ!
http://www.boost.org/libs/filesystem/doc/index.htm ここで directory_iterator についてのサンプルコード見てたら、
Note: Recursive directory iteration was added as a
convenience function after the above tutorial code was written,
so nowadays you don't have to actually code the recursion yourself.
らしいんだけど、1.34.1 での directory_iterator の使い方って
どこに載ってるの?
695 :
デフォルトの名無しさん :2007/09/21(金) 19:07:32
いままで、foo(const X& x) で引数を受け取っていた関数fooを、shared_ptrを使うように書き直す場合、 foo(const boost::shared_ptr<X> x) とすればいいんでしょうか? foo(boost::shared_ptr<const X> x) だったりしますか? 両者に違いはありますか?
>>695 const X *をスマートにしたのがshared_ptr<const X>
X *constをスマートにしたのがconst shared_ptr<X>
697 :
デフォルトの名無しさん :2007/09/21(金) 19:17:25
なるほど。では、const shared_ptr<const X> xで受けて、関数の冒頭でassert(x); するのがよさそうですね。 まぁ実際上は shared_ptr<const X> x でいいかな。 ともかく、ありがとうございました。
boost::serialization が便利そうなんで使いたいのですが vc++6.0 じゃ使えないのでしょうか? >LINK : fatal error LNK1104: ファイル "libboost_serialization-vc6-sgd-1_34_1.lib" を開けません。 boostビルド時にエラーがボコボコ出てたんで生成されなかったみたいなのですが・・・
vc6で使えないライブラリは多いよ これを機にvc2005に移行することをお勧めする vc2005でもwindows95で動くものは作る事は出来るようだし
そうですか 残念 お金無いので無償版vc2005の検討してみます
>>699 binary では、日本語を含む物は動きませんでした。
703 :
702 :2007/09/22(土) 20:12:20
VS2005 でね! Text や XML は問題ありませんでした。 私はバイナリだけが使いたかったので; がっかり
>>702 ん? wstring とかシリアライズできない??
string 内に漢字があると binary では シリアライズできません。
文字コードは何?
>>705 なるほど、マルチバイト文字を string に入れてるとダメなのか。
漏れは数値データばっかり扱ってたから気付かなかった。
むしろ double とかが nan (signaling/quiet) のときに
xml_oarchive では出力できるのに
xml_iarchive で入力すると例外が発生するのが不便。
boost/pool/detail/singleton.hpp ってまともな取り扱いされてる? 名前空間が boost::details::pool::singleton_default で、 なんかディレクトリと齟齬が生じているみたいなんだけど。 boost ではシングルトン関連はあんまり重視されてない?
709 :
デフォルトの名無しさん :2007/09/23(日) 04:10:44
自分で描けばええやん
>>709 ・・・・・・そんなこと言ったら boost 全部そうじゃん orz
>>708 detail以下をのぞくのは自重しる。
シングルトンは、自分用のを作るのは大変簡単だが様々な要求を満たす柔軟なのをつくるのは難し
いということで、割りにあわないから無いんだろ。古い話だがModern C++ Designのもアレだったしさ。
>>710 boost全部singleton並に簡単じゃないので、そうじゃないよ
>>712 シングルトンもスレッドセーフに作ろうと思うと
結構難しい気がするのだが・・・
>>711 そうか、detail 以下を覗くのはやめた方がいいのか。
-----------------------
ライブラリーで定義されているすべての開示された
シンボルは名前空間boost内にある。ライブラリーの
実装だけが使用するシンボルは名前空間
boost::details::pool内にある。
ライブラリーの実装だけが使用するヘッダーは
サブディレクトリーdetail/にある。
-----------------------
boost::detail:: ってそんな規約のもとに使われている
名前空間だったのか。全然知らんかった。
>>713 c++0xで関数の中のstaticなオブジェクトの初期化がスレッドセーフだと明言される予定だから、簡単になるよw
あるいはそれ先取りしてるgcc4使えばいまでも簡単だ。
VC++は、2003くらいではスレッドセーフでは無かったが、2005はどうなんだろ。
717 :
デフォルトの名無しさん :2007/09/23(日) 11:07:10
boostでpython使用のコンパイルが出来ない set PYTHON_ROOT="C:\Program Files\python" set PYTHON_VERSION=2.5 .\bjam --toolset=msvc --PYTHON_ROOT="C:\Program Files\python install でuser-config.jamに import toolset : using ; using python ; 入れたんだけどpythonの場所が分からないとほえます どうしたらいいんですか?
氏ねよ、コンパイルもできない、屑
719 :
デフォルトの名無しさん :2007/09/23(日) 12:41:53
あ、全部のワーニングが消えたので全部入ったみたいです…………?
721 :
デフォルトの名無しさん :2007/09/23(日) 13:13:52
ライブラリとインクルードパスまで指定しないと自分の環境では無理でした
初めてasio使ってみようと思ったら
>>495-496 と同じ症状が出てるんですけど
解決策分かるかたいらっしゃいますか?
VC2005ExpressEditionです
724 :
デフォルトの名無しさん :2007/09/23(日) 18:17:51
やっとコンパイル終わった。
>>722 2005スタンダードで通ったよ
外部参照云々はライブラリをちゃんと指定すれば動くんじゃね?
ドキュメントのビルドって難しいですね 環境はwindowsXP + cygwin, シェルはzsh、文字コードeucjpで $BOOST_ROOT/tools/boostbook/setup_boostbook.shを実行 $BOOST_ROOT/tools/quickbook/にてbjam --v2でquickbookを$BOOST_ROOT/dist/binに作成 $HOME/user-config.jamに using quickbook : /usr/src/boost/dist/bin/quickbook ; を書き加える 以上の操作の後 $BOOST_ROOT/tools/boostbook/docでbjam --v2でxslt-xsltprocで失敗 いやぁライブラリのビルドとは桁違いの難しさです
xsltのセットアップはもう一度やれと言われても出来ないかもしれない
boostdocのドキュメントのinstall and configurationの頁から飛べるところからとってきたxsltprocでは 絶対パスに含まれる:(コロン)が%3Aなどと化けているのが原因の一つのようだ ちなみにcygwinのxsltprocだと/も化ける(笑) 下手するとxsltprocのソース弄ってビルドしなおさないと駄目かもしれんね 流石にそこまでできる気力はないが Linuxなら同様の手順で難なくビルドできたんで、そこから持ってくることにしますか しかしcppllで翻訳して"た"人達は同じような環境でうまくできてたんですよね… なんか悔しいですわ
どうせ、g++じゃないと、いろいろ不都合も多いし、 普通にvmware + ubuntu Linuxでbuild&compileしてます。> Boost最新
729 :
デフォルトの名無しさん :2007/09/25(火) 00:19:41
いまtestのpass率でtopなのは、g++じゃなくて最新のVC++じゃないの?
CVS headのサマリーだとLinux版のicc9が強いようだ gccは結構駄目みたいけど、他では通りにくいのが通ったりと面白い結果になってる icc10はどれぐらい対応してるんだろうかが気になる
732 :
722 :2007/09/26(水) 06:27:23
>>723-724 ありがとうございます。
とりあえず使えるようになったのですが、
include する順番が違うだけで
>>495-496 になってしまうようです。
//↓コンパイル通らない
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <boost/format.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
#include <boost/date_time/c_local_time_adjustor.hpp>
#include <boost/asio.hpp> //←ここにあるとだめ
//↓コンパイル通った
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <boost/format.hpp>
#include <boost/asio.hpp> //←ここなら動く
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
#include <boost/date_time/c_local_time_adjustor.hpp>
以上ご報告まで
boost::filesystem::path でファイルパスをポータブルに 扱えるのは便利だけど、これからは URI や IRI も 扱う場面が増えてくるんじゃないかな? URI や IRI を扱うために便利なポータブルなライブラリって あります?
cURL ウソ
あなたが作って投稿してください
メモメモ vc8環境下でICU3.8をビルドしてboost.regexで使うようにすると icui18n.libとかicudata.libが無いっておこられる そこでicuin.libとicuind.libをicui18n.lib icui18nd.libに、 icudt.libをicudata.libにコピー&リネームすると通る regexのテストは一応全通過 本来はどうするべきなんだろうか…
さすがに他のライブラリをさらに必要とする 昨日は C++ の標準には入らないとおもうんだけど、どう?
>>737 他のライブラリを必要とするかどうかは実装の問題だから標準云々にはとりあえず関係ないと思う
Boost.Pythonとかは入らないだろうがな
むしろICUを標準に
741 :
デフォルトの名無しさん :2007/09/26(水) 23:57:31
Type2Type!
std::string pythoncode = "pythoncode"; Boost::Python python(pythoncode); cout << phthon;
bjamで俺ルールを使うときに import myrule ; みたいに書きたいんだけど、moduleの検索パスをどうやって追加するかがわからないので とりあえず確実に検索されてるなというパス $BOOST_BUILD_PATHと$BOOST_BUILD_PATH/utilに放り込むという方法しかとれないのが悔しい…でも(ry
pythonじゃなくてlispでメタな制御したいのだけど、boostにはそういうライブラリーはないの?
boostはないけど、CLOSやマクロやcall/ccやdefine-syntax使ったのが山ほどあるじゃん
746 :
デフォルトの名無しさん :2007/09/30(日) 18:16:00
boost::program_options って便利なんだけど、もっと、こう、 便利にならないかなぁ。たとえばオプションの一覧を 何らかのマクロで与えれば、それを解析する boost::program_options::options_description の インスタンスが自動的に生成されて、なおかつ コマンドラインオプションの解析結果を保持する シングルトンも自動的に生成されるとか。
>>746 ちょっとだけ使ってみたけど、何だかコードが長ったらしくなってしまい、
古典的なgetopt()を使ったコードに比べてそんなにいいとも思わなかった俺は
老害と言えよう。
748 :
デフォルトの名無しさん :2007/09/30(日) 20:26:01
boost::program_options::options_description dc; を、std::cout << dc; したときの出力速度がやったら遅い気がする。 のが気になった。
749 :
デフォルトの名無しさん :2007/09/30(日) 21:43:13
コマンドラインをパースしたとき、定義していないオプションが 出現しても例外を出さずに単に無視するだけにしてほしいんだけど、 そういうことはできないのかな?
750 :
デフォルトの名無しさん :2007/09/30(日) 22:06:37
パーサ自作して、extra_parser()で登録すればできると思うよ。
751 :
デフォルトの名無しさん :2007/09/30(日) 22:18:24
>>750 。。。。。面倒すぎる・・・
catch してやりすごそう・・・
と思ったけど catch しちゃったら
途中でパース投げ出してるじゃん!
753 :
デフォルトの名無しさん :2007/09/30(日) 22:25:20
>>749 実際は、もうすこし条件があるんじゃないですか?
私はたとえば、
./program -a -b -c executable_name -d -e -f
で、executable_name が登場した後の -d -e -f は executable_name へのオプションだか
ら、program_optionsライブラリにはスルーさせたいと思ったことがあって、それならごく簡単
なextra_parser (ちょっとした文字列比較のみ) でどうにかなりました。
754 :
デフォルトの名無しさん :2007/10/01(月) 00:02:52
boost.functionで、<>の中を関数プロトタイプのように書けるとおもいますが、その仕組みをおしえてくだsai。 boost::function<int hoge(int a, int b)> f; みたいなやつです。
最初にクラステンプレートfunctionを前方宣言しておいて、 function<R ()>は function0<R>を継承するよう部分特殊化。 function<R (T1)>は function1<R, T1>を継承するよう部分特殊化。 function<R (T1, T2)>は function2<R, T1, T2>を継承するよう部分特殊化。 以下function10になるまで繰り返し。 たぶんこんな感じ。
757 :
デフォルトの名無しさん :2007/10/01(月) 01:28:26
BOOST_STATIC_ASSERT(boost::is_same<U,double>::value); が、マクロに2引数渡すなゴルァって言われて エラーになってしまうんですが、どうしたらいいでしょうか。
>>757 BOOST_STATIC_ASSERT(boost::is_same<U BOOST_PP_COMMA( ) double>::value);
759 :
758 :2007/10/01(月) 01:51:51
あとヘッダはこれ #include <boost/preprocessor/comma.hpp>
BOOST_STATIC_ASSERT((boost::is_same<U,double>::value));
>>757 プリプロセッサは::を扱えないから仕方ない
>>761 ここでうまく扱えてないのは :: じゃなくて <> の引数リストね。
766 :
764 :2007/10/01(月) 04:14:27
MPL初心者です。MPLで遊んでいてちょっと詰まったので質問させてください。 typedef boost::mpl::list< boost::mpl::lambda< boost::is_same< // equal_toのほうがいいのかな boost::mpl::_1, boost::mpl::int_<0> > >::type, boost::mpl::lambda< boost::is_same< boost::mpl::_1, boost::mpl::int_<1> > >::type > cond_list; みたいなリストに対して、(つづく)
767 :
764 :2007/10/01(月) 04:15:09
(
>>766 の続き)
template<int V>
static void XXX(typename boost::disable_if<
boost::mpl::or_<
boost::mpl::bool_<false>, // initial value
boost::mpl::or_<
boost::mpl::at_c<cond_list, 0>::type::apply<boost::mpl::int_<V> >,
boost::mpl::at_c<cond_list, 1>::type::apply<boost::mpl::int_<V> >
>
>
>::type* = 0) {
std::printf("default\n");
}
みたいな関数を書きました。cond_listの全要素に対してapplyしてor_してます。
このXXX()を、boost::mpl::foldを使って書き直したいんですが、
第三パラメタ fold<cond_list, boost::mpl::bool_<false>, ここ> はどう書いたもんでしょうか。
メタ関数 template<bool B, int V1, int V2> struct hoge {} を用意して、lambda<hoge, _1, _2, V>しとく
769 :
デフォルトの名無しさん :2007/10/01(月) 06:54:53
BOOST_STATIC_ASSERT って、 #include <cassert> の assert() マクロに比べて 何が嬉しいの?
770 :
デフォルトの名無しさん :2007/10/01(月) 07:05:56
assertは実行時に失敗する static assertはコンパイル時に失敗する 失敗がはやければ立ちなおれるかもしれないだろ?
771 :
デフォルトの名無しさん :2007/10/01(月) 07:22:52
772 :
デフォルトの名無しさん :2007/10/01(月) 07:25:53
当然だけどコンパイル時定数しか扱えないよね。 sizeof のチェックとかに使うことが多いのかな? あんまり使い道思いつかないんだけど。
>>72 素で言ってるのか?
template ってコンパイル時にしか使えないから使い道思いつかないって
言ってるのと同じだぞ
どっちでも意味がとれるミスタイプだなw
>>773 ええ〜テンプレートは使いまくりだけどさ、
マジで BOOST_STATIC_ASSERT が便利に
使える場面ってのがよくわかんなくって。
あほな俺になんか実例紹介してくれ。
検索かけてみればboost内では BOOST_STATIC_ASSERT( is_xxx< X >::value ); みたいにtype_traitsとの組みあわせで使われてるのが多いようだ
なるほど
メタプログラミングするときメタ関数の戻り値をチェックしたり。 mplとか使わないならconcept checkで大体用は足りるかも。
今の STL ってコンセプトチェックしてくれないよね? って俺が使ってる VC++8 についてくる STL のことしか 知らないんだけどさ。 SGI のやつとかはコンセプトチェックしてくれるの?
780 :
780 :2007/10/02(火) 11:08:49
事故解決しました
781 :
デフォルトの名無しさん :2007/10/02(火) 11:59:29
boost::optional なんてのを知った。 いままで、エラーの流れとデータの流れは分離せよ、 という自戒から意味のある値を返せない時は例外を 投げてたんだけど、「意味のある値が返せない」 ってことを返せるんだよね・・・ 同様のケースでは今まで NULL ポインタかえしたり、 たとえば 0 より大きな値をとることが分かっている 関数が 0 を返すことでエラーと見なしたりしていて、 自分はそういうの気持ち悪いなぁ、って思ってたんだけど、 なんかその自戒が崩壊していきそうだ。
世の中、エラーではないけど意味のある値を返せないという状況もある。
うほっ、これは便利。 -- template<typename IterT, typename ValueT> void print_unique_values_in_sorted_sequence(IterT begin, IterrT end) { boost::optional<ValueT> lastValue; for (IteratorType i = begin; i != end; ++i) { if (! (lastValue && *i == *lastValue)) std::cout << *i << std::endl; lastValue = *i; } } -- 値保持変数と有効フラグ変数を持ち回る必要がなくなるじゃぁないか。
なんかさ、こんなのがあったらいいなぁ、ってのが boost にはたいていあるよな。で、自前で作ってた のよりもはるかによく考えられて設計&実装されてる。 俺って不要なんじゃね? 今頃気づいた。
>>784 何を言う。boostは部品だ。つまり君は、部品をどう組み立てるかに専念すればいいということだ。
じゃ、俺、生きててもいいんだ… カーチャン
http://pc11.2ch.net/test/read.cgi/tech/1139266461/ _,,‐─-v‐、,,、
,,-‐'": : : : : : : : : : `ヽ
/: : : : : : : ,,__ : : : : : : \
r': ,、,,.-─''"゛ ミ : : : : : : : 'i、
`/ / ミ_ : : : : : : :,、}
i l _,,..-‐^‐-、 `゙i: : : /l.l|
i、}‐-、 ヽ;;/,rェッ;;'" ゙ー' 9iリ!
| ',tテi ヽ='" ゞ t'
| 'i"´| , -、 ヽ-、,,___
| '}、 !,,tu'" ヽ、 ,l: ‐-‐" }: : : : :
} lヽ、__,,,.-‐ヽ /: : : : : : /|: : : : :
,r/ /: : :ヽー‐' ノ: : : : : : : / .|: : : : :
/: \ /: : : : : 丶,, -''_: : : : : : / |: : : : :
/: : : : :ヽ/: : : : : : : ヾ''‐--‐ヽ |: : : : :
/: : : : : : : : : : : : : : : : : : ヽ\: : / |: : : : :
ブーツ=デ=ヤーレ[Buits De Yale]
(1955〜 フランス)
>>783 *使ってうまくセットにしたって感じだよね。
多値好きな俺には堪えられない。
boostは部品だが、boostを使ったソフトウェアも、ソフトウェアを動かすOSも、コンピュータそのものも、
それが吐き出したデータも、データを利用する部署も、世の中は全て部品だ。
そして784の作る部品よりも全て別の人が作った部品の方がよく考えられて設計、実装されているならば、
784は不要な存在であると言える。
どうでもいいけど
>>787 の元ネタってアーサー・ケストラーだっけ?
>>784 なんかマ板じゃないけど愚痴っちゃうけど。
いくら努力したって頂点付近にいる人間にはなれないわけよ
そんな中で俺の存在意義って見出せないんだよなー
とか思ってもう5年。
プログラム書くのなんて資本が要るわけじゃなし、他の分野と比べれば 割と誰でも頂点に行ける世界だよ。
793 :
783 :2007/10/02(火) 17:07:57
>783のコードは検索して引っ掛かったものをそのまま貼ったんだけど、 どうせなら引き数はrangeにして欲しかったような希ガス。 -- template<typename Range, typename Value> void print_unique_values_in_sorted_sequence(Range & r) { boost::optional<Value> lastValue; boost:range_iterator<Range>::type i = begin(r), e = end(r); for (; i != e; ++i) { if (! (lastValue && *i == *lastValue)) std::cout << *i << std::endl; lastValue = *i; } } -- 帰ったら試してみよ。
>>790 どんな天才も、お前の代わりにトイレには行けないんだよ!
boostって環境依存なライブラリじゃないんでしょ? ならboost/threadってどういうこと?
は?
windowsとか、特定の環境じゃないと使えないじゃん
誰が「boost全体が」環境非依存なんて言った?
>>795 Windows APIを使った実装とpthreadを使った実装を用意して、
環境次第でどっち使うかが切り替わるようになっている。
もちろん、どっちも使えない環境ではアウト。
>>790 それは逆だと思うね
天才のミス(バグ)を凡人が修正できるのはプログラミングの分野だけだ
天才とか凡才とか、そんなこだわりを持ってない奴が一番巧いんだよ
>>783 ひどすぎる
・IterT を IteratorType と書きミス
・ValueT を iterator_traits<> から求めず、なぜかテンプレート引数で受け取っている
・ループの最初で IterT last = begin とし、++begin からループすれば
毎フレーム lastValue をチェックする必要は無いし、ValueT も不要にできる
・そもそも boost::optional<> 使う必要が無い
・std::unique_copy と std::ostream_iterator を使え
>>801 なんだそのうまい事いったな的なセリフは。
boost.Interfaceのtemplate based IDLはまだかね? 作者のうちの一人は変な言語作って、OOTLすら更新止まってるし… 今のところはboost MLでjoelさんがマクロベースIDLにケチ付けたときに示した方法でやってるけど あの方法もメソッドの型をいちいちインタフェースとは別に定義しなきゃならんから 二度手間になって、マクロベースIDLと同じくらいダサいし… なんかインターフェース定義の決定版みたいなものはないのかのぅ
とりあえず自演乙
Boost.Interfacesって 仮想関数と比べて どの程度のメリットがあるの?
俺、メソッド名とか覚えられないから Visual Studio 2005 の IntelliSense がないと作業効率半減。 ほかの IDE といえば emacs (IDEか?) と Eclipse CDT しか 使ったことないんだけど、補完機能に優れているものって Visual C++ のほかになにか候補ある? boost ってテンプレート多用のせいか IntelliSense が 混乱してだんまり決め込むことも多いんだけど、最近 IntelliSense を混乱させる原因がわかってきたんで boost のヘッダファイルを書き換えて(といっても セマンティックスは等価な別の書き方にしてるだけ) IntelliSense friendly な boost を作成中。
boost::xtime って使い方がよくわからない・・・ というか、スレッドライブラリの使い方について 日本語での説明ってないかなぁ。 そろそろ _begin_thread (Win32) とかを 生で呼び出すのがみっともなく見えてきた。
>>806 継承っていう非常に強いクラス間の結合を回避できるってのが一番大きいことなんじゃないかな?
まぁvtblが要らんからインターフェースを実装するクラスのサイズが少し小さくなるとか、
vtbl経由じゃなくて直接インスタンスのポインタから呼びだされるから少し呼びだしのコストが減るとか
ちょっとしたメリットもあるけどさ
つ 実行時継承
仮想関数でコンパイラでチェックをしながら作って CRTPで最適化するってのがいい気がする。
intellisenseの代替になってねーじゃん
boost::optional とか内部的に boost::mpl を使っているのが あるけど、boost::mpl みたいに高度(変態)なテンプレート の使い方していると IntelliSense は混乱するみたいだねぇ。
2008で改善…か?
真面目にパースしてたら重くなるだけじゃね
boostに参加したいけど英語できないし諦めるわ。
818 :
デフォルトの名無しさん :2007/10/04(木) 00:26:03
BOOST_PP_SEQの要素をカンマで区切って結合するにはどうしたらいいのでしょうか? 以下のようにやると、 int a,int b になってしまう・・・ #define SEQ (int a)(int b)(int c)(int d) #define OP(s, state, x) state,x BOOST_PP_SEQ_FOLD_LEFT(OP, BOOST_PP_SEQ_HEAD(SEQ), BOOST_PP_SEQ_TAIL(SEQ))
>>818 コールバックマクロが裸のコンマを含むトークン列に展開されると色々まずい。
BOOST_PP_SEQ_ENUMを使うべし。
820 :
818 :2007/10/04(木) 00:56:29
>>819 ありがとう。
BOOST_PP_SEQ_ENUM(SEQ)
でできました。
822 :
デフォルトの名無しさん :2007/10/04(木) 01:59:58
>821 それだけかよっ gccなら警告してくれるんだぜ?
基底クラスを自分が作ってないという状況を想定するナリよ
>>822 そういう問題じゃないだろw
設計として上の継承階層だけvirtualにしたいケースだろ。
>>821 は「し忘れてる」なんて書いてるけど、boost.interfaces使っても、
規定クラスの方もvirtualになるわけじゃないんだから。
しかし、つくづくtemplateって凶悪だよな。
降りるヤツと残るヤツ・・それだけだ
827 :
デフォルトの名無しさん :2007/10/04(木) 09:12:02
いわゆるアクセス関数 (get/setみたいなメソッド)のために 便利な仕組みって boost に用意されていたりしません?
829 :
デフォルトの名無しさん :2007/10/04(木) 19:13:41
なんかキモイね
似たようなの作ろうとした事あるけど var.prop.member() のように 直接プロパティのメンバにアクセスできなくて諦めた。 やっぱC++0xを待つしかないか。
832 :
デフォルトの名無しさん :2007/10/05(金) 13:25:26
C++0xでは言語仕様としてそういう機能が入るの?
833 :
デフォルトの名無しさん :2007/10/06(土) 01:32:23
mplで質問です。 mplでは、文字列のリテラルを扱うことはできるでしょうか? 具体的には、3文字または4文字(それ以外はない)の文字列リテラルを受け取って、ある文字cが入っていれば mplのtrue_、入っていなければfalse_を返すメタ関数を書きたいのです。 可能でしょうか?
>>832 N2389のリストにはそれっぽいもの(N1615)があるが、Not ready for C++0x になってる
残りの期間を考えると採用される可能性は低い
>>833 たぶん無理
835 :
デフォルトの名無しさん :2007/10/06(土) 08:46:05
>>834 じゃぁ言語仕様としてじゃなくてやっぱりテンプレート
としての実装でやらなきゃだめなんだね。
例の boost の sandbox のやつが正式に入ってくれればいいなぁ。
要らないなぁ
言語仕様に変更が必要な割にはメリットが薄いなぁ
Propertyそのものはいらないな。 やっぱりtemplateで。
839 :
833 :2007/10/06(土) 16:50:14
getだのsetだの関数にしなくても コピー代入演算子あたりのオーバーロードを駆使すれば VB的なプロパティは実現できるではないだろうか
メンバが全部ユーザ定義型ならそれっぽくできるだろうけど・・・
組み込み型から派生したクラスが作れればいいのに
schemeがcontinuationをfirst class objectにしたみたいに、 C++もreference/dereferenceを扱えるようにすればいいのじゃ。
844 :
デフォルトの名無しさん :2007/10/06(土) 20:33:13
template<char C1, char C2 = '\0', char C3 = '\0', char C4 = '\0'> struct Z Z::<'a', 'b', 'c'>::value または、全てのコンパイラでいけるのかしらんけど template<unsigned int C> struct Z Z<'abc'>::value
846 :
833 :2007/10/06(土) 20:46:08
template<const char* S> struct Z { static const int value; } ; template<const char* S> const int Z<S>::value = S;[0] char hoge[] = "aaa"; int main() { return Z<hoge>::value; } はどうもコンパイルできるっぽいです。ありがとうござました。
template<char const *STR> struct Test { char const *p; Test(void) : p(STR) { } void Print(void) { std::cout << STR << std::endl; } void Print2(void) { std::cout << p << std::endl; } }; extern char const STR[] = "Hello."; int main(int argc, char *argv[]) { Test<STR> test; test.Print(); test.Print2(); } 内部リンケージがあるからダメって怒られたから externつけたらいけちまった。なんてこった…。
848 :
833 :2007/10/06(土) 21:14:28
>>846 だー
クラス外で初期化するんじゃ、全然コンパイル時の計算にならんですね。orz。
つーかな enum{ AAA = "a"[0] }; をコンパイルしたら分かると思うけど "a"[0] という式がもうコンパイル時定数式とならないからムリなの。
850 :
デフォルトの名無しさん :2007/10/06(土) 22:03:13
おっしゃるとおりで。 C++0xでは何か変化あります?
おまいらDに負けそうですよ
namespace po = boost::program_options ; po::options_description desc("options") ; desc.add_options() ("hage", po::wvalue< std::wstring >()->default_value("Bjarne Stroustrup") , "hage") ; このコードをコンパイルしようとすると、std::wstringからstd::stringへ、lexical_castしようとしてエラーになるのですが、 あきらめるしかないのでしょうか?
853 :
デフォルトの名無しさん :2007/10/07(日) 00:01:44
脊髄で答えるけど、禿かビャーネスポスポのどちらかor両方にLをつけてないからじゃないの? L"hage" な。
書き間違えてました。 ちなみに、 Lを付けないと、default_valueはstd::wstringを引数に取るのでコンパイルエラー Lを付けると前述の通り。
>>852 > Throughout this document "Unicode support" is a synonym for "char to wchar_t conversion" support
856 :
852 :2007/10/07(日) 00:52:03
今日3時に書いた自分のブログの愚痴が、もうgoogleに拾われて、しかも上位に来るとか、何のギャグですか。
虫さんか。 まぁ、po使ってる奴が少ないんだろうさ。
調べ者してたらgoogleの三番目に出てきたページが 過去に自分がこの板で質問した内容だった時の脱力感
Boost使いなどみんなそんなもんだ。
>>826 でいうと大体いなくなったからな。
最近boostを知ったんだけどかなり使えそうだね これ知らずにC++やってた(/д\;)ハズカシ
861 :
852 :2007/10/07(日) 04:10:44
自分で書き換えてやろうかとおもったら、 なんか意外とあっさりできてしまった。 boost/program_options/value_semantic.hppに #include <boost/program_options/detail/convert.hpp> を付け加えて、 typed_valueのプライマリテンプレートの下に、次のメンバ特殊化を付け加えればいい。 template<> typed_value<std::wstring, wchar_t> * typed_value<std::wstring, wchar_t>::default_value(std::wstring const & v) { m_default_value = boost::any(v); m_default_value_as_text = boost::to_utf8(v); return this; } メンバ特殊化って便利だね。
862 :
デフォルトの名無しさん :2007/10/07(日) 04:40:00
C++相談室part56のこれ相当のものって、Boostに入ってますか? template<typename T, size_t N> char (&lengthof_helper_char_array(T (&a)[N]))[N]; #define lengthof(a) (sizeof(lengthof_helper_char_array(a))) Rangeのsize()はちょっと違うよね。
863 :
862 :2007/10/07(日) 05:33:37
http://www.ddj.com/cpp/197800525?pgno=7 の方法で長さを出す奴でもかまいません。
// a struct defined such that sizeof(Size<N>::Type) == N
template<int N>
struct Size
{
typedef char Type[N];
};
// returns an object whose size is the number of
// elements in the passed array
template<typename T, int N>
typename Size<N>::Type& count(const T(&array)[N]);
で、sizeof(count(a)) という。
865 :
デフォルトの名無しさん :2007/10/07(日) 11:28:18
>>864 extentだと変数ではなく型を渡す羽目になるような。
typeofがあることを前提とするなら問題ないけど。
867 :
デフォルトの名無しさん :2007/10/07(日) 19:30:20
>>866 VC8って結局boostのtypeofは使えるの?つかえ内の?
868 :
デフォルトの名無しさん :2007/10/07(日) 21:38:48
今朝Boostを知った新参者です。 コンパイラはVC++6を使ってます。 質問ですがBoostのmatrixを使って、 複素数の行列の計算は可能でしょうか。 実数行列matrix<double> 複素行列matrix<complex> のような感じにしたいのですが。 complexは標準ライブラリのを使おうと思ってます。 (他に推奨ありますか?) よろしくお願いします。
VC6か…… stlportでもいれないとな…
VC6か・・・・
vc6か。。。。
872 :
868 :2007/10/07(日) 21:53:03
ええっ VC6の時点で試合終了ですか
まだサポートしてたっけ VS2005にすれば
諦めたらそこで試合終了だy・・・VC6か・・・諦めたら?
vc2005EE + WTL で無料でwinアプリ作れちゃうよ
微笑ましいなw
877 :
868 :2007/10/07(日) 22:06:33
とりあえずstlportを入れてみました。 これで何とかなりますか?
878 :
868 :2007/10/08(月) 00:14:19
何かもう駄目っぽい気がしたので、とりあえずcomplexは保留します。
(できれば知りたいですが)
実数行列だけ考えることにして、ためしに
http://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html#SEC4 ↑ここにある
連立方程式を解く
の例にあるコードを、そのままコピーして
ビルドしようとしましたが
\boost_1_32_0\boost\numeric\ublas\lu.hpp(131) : error C2780:
'const class boost::numeric::ublas::matrix_indirect<M,class
boost::numeric::ublas::indirect_array<A> > __cdecl boost::n
umeric::ublas::project(const class boost::numeric::ublas::matri
x_indirect<M,class boost::numeric::ublas::indirect_array<A> >
&,const class boost::numeric::ublas::indirect_array<A> &,const cl
ass boost::numeric::ublas::indirect_array<A> &)' : 3 引数が必要で
す - 2 が設定されます。
↑こんな感じのエラーが大量に発生してやばいです。
よろしければ、この解決策を教えていただけないでしょうか。
VC2005を入れろ
素直にVS2005のEEでも、入れろよ。 みたところATLやMFCが必要だとは思えんし。
881 :
868 :2007/10/08(月) 03:41:01
VC2005入れたらエラーも発生せずできました。 3時間くらい悩んだりしていた甲斐があったと思います。 これは行列の固有値計算もできるんですか?
882 :
868 :2007/10/08(月) 03:56:05
アッー! matrix<complex<double>> もできた。 さっきはできなかったのに なんかもう、色々許せない。VC6は許せない。
boost::regexでsmatch 使うとそれ以降でインテリセンスが死んじゃうみたいなんだけど 回避策ありませんか? VC2005EEです
インテリセンスは死ぬためにあるのです
boostとインテリセンスは千日戦争に突入しているので、見守ってあげてください
インテリセンスで不具合がおきている人は日本語版VisualStudio使っているのかな?
888 :
デフォルトの名無しさん :2007/10/08(月) 11:15:56
>>887 お、そこには思いが至らなかった。
英語版の Visual Studio 2005 では死なないのかな?
でも boost の ml などを見てると結構死んでる人もいるみたい。
>>884 なんか typedef が多重にかかると追い切れないのかもね。
boost/regex/v4/match_results.hpp の 49 行あたりにある
typedef typename vector_type::const_iterator const_iterator;
を vector_type を使わずに生のまま書くと IntelliSense は死なないみたい。
typedef typename std::vector<sub_match<BidiIterator>, Allocator>::const_iterator const_iterator;
ところで、こういう宣言文での typename って必須?
IntelliSense を殺してしまうようなヘッダファイルは Boost の
そこかしこにあるんだけど、自分で使うヘッダファイルについては
すべて修正してます。filesystem, mpl, optional, regex あたりが
その代表かなぁ。
>vector_type を使わずに生のまま なんのこと?生? >ところで、こういう宣言文での typename って必須? 必須
英語版VisualStudioだと問題ないなあ。問題といっている ヘッダファイル使っているんだけどね。
>>888 どうもです
書き直してみたけどやっぱり駄目みたい
便利な物は失うと辛いな(´Д`;)
892 :
デフォルトの名無しさん :2007/10/08(月) 11:42:25
>>889 「生」ってのは、その直前に
typedef std::vector<sub_match<BidiIterator>, Allocator> vector_type;
っていう宣言文があって、そこで宣言した vector_type を使わずに、
っていう意味で使った。
typename が必要になるのってどういうケースなんだろう。
じつは typename よくわかってない。テンプレート引数に
class って書いてたのが最近は typename って書くのが流行り?
って程度の認識。
>>891 え?だめ?おかしいなぁ。
Visual Studio 2005 Professional SP1 日本語版
boost 1.34.1 なんだけどなぁ。
>>892 std::vector<sub_match<BidiIterator>, Allocator>::const_iterator
ってあったら、これが型なのかそうじゃない(例えばstaticメンバ変数)のかコンパイラには分からん
だからtypenameで明示しない限り型じゃないとみなすことになってる
>>894 なるほど、クラスメンバと混同するからか。
typedef std::vector<sub_match<BidiIterator>, Allocator> vector_type;
それでこの場合には typename がなかったのか。
>>891 ncb ファイルを一度削除しないとだめかもね。
Visual Studio が起動している間に削除してもだめだよ。
ちゃんと終了してから削除しないと。
試しにvector_typeを全部「生」にしてみたけど駄目だった やり方がどこか違うのかな・・・ 残念
2005だが、 インテリセンスが混乱したら キャッシュ(ncbファイルだっけ)を削除したら一時的に直る。
基本的にboost使う奴が悪いんだから、このさいインテリセンスは諦めましょう。
特定のライブラリのみビルドする方法は用意されているのでしょうか?
>>901 どーだろ。でも、ライブラリ別に.soとか.aができるから、必要な奴だけリンクすることは可能。
だから部分ビルドできるかはあまり関係ない気もするんだが。
ところで C++0x ではクロージャの機能は入るんですか?
904 :
903 :2007/10/09(火) 04:31:35
と思って書き込んでからちゃんとよんでみたら、なんとかなりそうなのかな。よくわかりません。失礼しました
VC++2005EEの環境で
>>878 のコードをビルドしてみたんですが、リンクエラーが出てしまいます。
ランタイムライブラリをMT,MTd,MD,MDdのそれぞれ1回ずつ、バッチビルドでDebugとReleaseの両方をビルドしてみたんですが、どれもリンクエラーが出ました。
↓はMDdでビルドしたときのエラーです。
------ ビルド開始: プロジェクト: aa, 構成: Release Win32 ------
aa.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<char,struct std::char_traits<char> >
(class std::basic_ostream<char,struct std::char_traits<char> > &,char)"
(__imp_??$?6DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z)" は未解決です。
aa.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) private: static char const * __cdecl std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Nullstr(void)"
(__imp_?_Nullstr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@CAPBDXZ)" は未解決です。
aa.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) char const `private: static char const * __cdecl std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Nullstr(void)'::`2'::_C"
(__imp_?_C@?1??_Nullstr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@CAPBDXZ@4DB)" は未解決です。
aa.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<char,struct std::char_traits<char> >
(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)"
(__imp_??$?6DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z)" は未解決です。
907の続き Debugのエラーはあまりにも長いので、とりあえずReleaseだけにしておきます。 どこか設定が間違っているのでしょうか? お願いします。
>>907 2005、Boost1.34だが、
31->33行目はoperator()で書き直せば通ったけど?
A[0][0]=1.0; -> A(0,0)=1.0;
910 :
907 :2007/10/09(火) 19:49:15
>>909 A[0][0]=1.0; -> A(0,0)=1.0;に書き換えてみましたが、同じエラーが出てしまいます。
ちなみにboost1.34.0だと、
c:\library\boost_1_34_0\boost\numeric\ublas\detail\config.hpp(174)
: fatal error C1189: #error : Your compiler is unsupported by this verions of uBLAS. Boost 1.32.0 includes uBLAS with support for many old compilers.
というエラーが出てしまうので、1.32.0を入れました。
リンクエラーの意味がわからないので、どうすればいいのかさっぱり・・・。
911 :
909 :2007/10/09(火) 20:32:32
>>910 ランタイムライブラリは
マルチスレッド(デバッグ)?DLL
使わないとエラー大量に出るよ。
lib,includeディレクトリには1つのバージョンのみのBoostだけ入れてよ。
Boost1.34.1
これでもできないならなんか環境ファイルが壊れてるのかもしれん。
912 :
907 :2007/10/09(火) 22:44:28
>>911 1.34.1入れてビルドしてみましたが、やはり
>>910 に書いたエラーが出てしまいます。
(このエラーが出るということは、コンパイラが1.34.1のublasに対応してないということですよね?)
1.32.0でビルドすれば、コンパイルは通るんですが、
どのラインタイムライブラリでやっても、
>>907 のリンクエラーかそれよりたくさんのリンクエラーが出てしまいます。
リンクエラーの内容がstd::basic_ostreamとかだったりするのは、
やはり環境変数がちゃんと設定できていないか、壊れているかそのあたりがあやしいですか?
boost::test::unit_test ってテスト終了時に メモリリークの検出までやってくれるんだね。 どういう方法でリークを検出しているんだろう。 もしかしてメモリアロケータを標準のものから 置き換えてなにかやってるのかな?
>>912 通りすがりだけど・・・
#include <ublasのヘッダもろもろ>
int main()
{
// 何も書かない
return 0;
}
でコンパイル通る?
経験則から言うとVC7以上であればublasのバージョンは問題ないと思う
>>913 unit_testのメモリリーク検出良いよね
うっかりポインタ操作をミスしていたのを見つけてくれたことがあるよ
915 :
907 :2007/10/10(水) 04:01:05
>>914 ヘッダだけのコードを1.32.0でビルドしたら成功しました。(1.34.1は、やはり
>>910 のエラー)
1.34.1でビルドするとboost/numeric/ublas/detail/config.hppの
// Version 6.0 and 7.0
#if BOOST_MSVC <= 1300
#define BOOST_UBLAS_UNSUPPORTED_COMPILER 1
#endif
の条件に該当してそうです。
コメントアウトでいろいろコードを削って試してみたら、どうもstd::coutを使うとリンクエラーが出るっぽいです。
原因がスレ違いで申し訳ないです。
あとは自分でなんとかします。
レスくれた方々、ありがとうございました。
unit_testの話題が出ているので...質問させてください 他のライブラリを使用したコードのテストをするため unit_testを利用しようとしたところ、リンカで次のエラーを得ました ***.lib(main.obj) : error LNK2019: 未解決の外部シンボル _MAIN__ が関数 _main で参照されました。 unit_testがmain関数を横取りしていることあたりが原因だとは思うのですが 何とか上手く回避できないものでしょうか? お心当たりのある方はご教示いただけると幸いです
unit_testを使わない boostなんて無理してまでも使うもんじゃない。
お前ら、ステートマシンはどのライブラリを使っていますか? Cで書いた糞自作ライブラリから乗り換えようと思ってるんですが。
糞自作ライブラリから乗り換えようと思った理由は?
FSMは昔GPGに載ってたAI用のやつをいじって使ってる
typedef使えばいいような
テキストエディタ使ってコマンドラインからコンパイルしようとすると boost関連のincludeが見つからないと怒られたので vsvars32.batにboostのincludeとlibパスを追加してみたら 今度はfatal error LNK1120: 外部参照 1 が未解決です。と出る どうしたら良いのでしょうか?
925 :
924 :2007/10/13(土) 14:42:35
書き忘れ VC2005EEです。。。
具体的に何が見付かりませんと表示されるだろう。 そっち見ないとわからない。たぶんスレ違いの気がするけれど。
927 :
924 :2007/10/13(土) 15:02:11
error LNK2019: 未解決の外部シンボル "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXABVexception@std@@@Z) が関数 " int __cdecl boost::lexical_cast<int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > (class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??$lexical_cast@HV?$basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@std@@@boost@@YAHABV?$basic_string@DU?$char_traits@D@std@@ V?$allocator@D@2@@std@@@Z) で参照されました。 boosttest.exe : fatal error LNK1120: 外部参照 1 が未解決です。 長いんでカットしてました スレ違いならごめんなさい
うちはうまくうごいとるよ
boostでまだ使えないvc向けのものがあるね
>>927 VC のオプションの「C++ の例外を有効にする」がいいえになってるか
明示的に BOOST_NO_EXCEPTIONS を定義したのでは?
YAMLの実装はありますか?
932 :
924 :2007/10/15(月) 18:11:46
>>930 遅レスですいません
ビンゴでした
/EHsc オプションつけたらコンパイル通った
ありがとうございました
でも、なにもした覚えはないんだけどな・・・
実行時型情報を使うのってあんまり気持ち良くないなぁ。 おまえらは全然抵抗ありませんか? 型に関するあれやこれやはコンパイル時に解決 されているのがC++のいいところだと思ってたんだけど。 あと、これは単なるコーディングスタイルなんだけど、 メンバ変数をアクセスするときに this-> を強制したいなぁ。 あくまで自分が間違えてメンバ変数と同じ名前のローカル変数を 作ってしまうことがあるバカ者だからなんだけどね。 まぁこれは命名規則をきっちり決めておけばいいんだろうけど。
boostと何の関係が?
RTTIをオフにすると、Boost のなかで使えない ライブラリが出てくる。どのライブラリが RTTIを要求するか、例外のサポートを要求するかについての リストがあれば便利なケースもあるんじゃないかなぁ、とか思いながら。 さすがに組み込みで Boost の全ライブラリのサポートを 要求する人はいないと思うが、どれが使えてどれが使えないか わかればいいなぁ。
独り言うぜぇ
つうか、メンバ変数は大抵 xxx_ とか m_xxx でぶつからないだろ
インテリセンスで使いやすいように _xxx じゃ問題ある?
>>938 頭にアンダースコアの識別子は標準ライブラリやコンパイラのベンダのためにあるから使っちゃ駄目。
>>939 はい、間違いです。規格書読み直してくださいね。
>17.4.3.1.2 Global names >Certain sets of names and function signatures are always reserved to the implementation: >Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase >letter (2.11) is reserved to the implementation for any use. >Each name that begins with an underscore is reserved to the implementation for use as a name in the >global namespace 大文字でないので、メンバに使うのはおkってことか? なんにせよ俺は使いたくはないな。
マクロとぶつかったりするととても悲しいのでやめた方が無難
バカかお前。ぶつからねーって回転だろ
独自のテンプレートライブラリを作るときに boost::mplを使うときに一々ヘッダでboost::mpl::bindとか完全修飾で書くとみにくいので namespace mpl = boost::mplとかusingを使いたいんですが namespace my_lib { namespace hoge_impl { }
945 :
944 :2007/10/16(火) 19:46:07
namespace my_lib { namespace hogee_impl { // *この名前空間でusingやnamespace hoge = foo::bar;を使う tempalte<class Hoge, class Huga, class Foo> struct impl { typedef ... type; }; } // namespace hoge_impl tempalte<class Hoge, class Huga, class Foo> struct hogee { typedef typename hogee_impl<Hoge,Huga,Foo>::type type; }; } // namespace my_lib というようにしてhogeeをmy_lib::hogeeとして使えば問題ありませんか? ADLとかまだよくわからないのでちょっと心配です
それってBoostと関係あるのか?
>>945 どんなことが起こるのを心配してるの?
見た感じ、好きにすれば、って感じなんだけど。
struct A{ long a; }; struct B{ A inner; explicit B(long n){ inner.a = n;} }; struct GetB_ : public std::unary_function<B&, A&>{ A& operator()(B& element) const{ return element.inner;} }; typedef std::vector<B> vectorB; typedef boost::transform_iterator<GetB_, vectorB::iterator> testIterator; int main(){ vectorB v; for(int i=0; i<100; ++i) v.push_back(B(i)); testIterator p2(v.begin(), GetB_()); cout << typeid(p2[0]).name() << endl; //cout << p2[0].a << endl;←コンパイルエラー return 0; } transform_iteratorについての質問なんですが p2[0]の型がclass boost::detail::operator_brackets_proxy<class boost::transform_iterator<class GetB_,class std::_Vector_iterator<struct B,class std::allocator<struct B> >,struct boost::use_default,struct boost::use_default> > ってなってて、[]演算子だけ変です。これでは使い物になりません。 iterator_facade.hpp見ると、 // A proxy return type for operator[], needed to deal with // iterators that may invalidate referents upon destruction. // Consider the temporary iterator in *(a + n) と書いてありますが、いまいちわかりません。 自分でイテレータ作るしかないんでしょうか…?
>948 都合により直接メンバアクセスすることはできない。ただし、A& に変換することはできる。 ということで、不格好だけど、static_cast<A&)(p2[0]).a みたいにするか、long& getA(A& a) { return a.a; } を作って getA(p2[0]) みたいにする必要がある。 コメントの部分はこういうことだと思う。 p2[n] が A& を直接返していたとする。 この時返ってくる A& は *(p2 + n) の結果なんだけど、 p2 + n は iterator の一時オブジェクトで既に破棄されていることになる。 iterator によっては自分が破棄された場合に、指し先(この場合返ってきた A&)も無効化するものがあるかもしれない。 ということで、p2 + n に対応する iterator が存在することを保証するために proxy オブジェクトが使用されている。
>>949 あー、なるほど。
分かりやすい解説ありがとうございます。
確かに、さっきのp2で
cout << (*(p2 + 5)).a << endl;
って添え字演算子と同じことをやると、Visual Studio がアサート失敗を出す。
vectorのイテレータが破棄されちゃうのね…。
>>948 は例のためにvector使ったんで、
実は本当にtransform_iterator使いたいのはポインタだからこの問題は起こらない…。
transform_iteratorを継承してoperator[]を隠蔽してみます。
ほーい
>>950 iteratorは継承して作ってはいけない
書くの面倒だけど書かないとね。 iterater_facadeとか使って。
つーかそれ無しだと書く気が起きない
>>781 int | ∞ を表現するのに便利そう。> boost::optional
> boost::optional 通常処理→戻り値数値 通常処理でない→戻り値NULL という関数を試作したらNULL値が0として振る舞って失敗した事があった そのとき代替で使ってみた。良い方法かどうかは知らないけど
ワラ
まさかこういうことをしたのか・・・。 int hoge() { return NULL; }
そのレベルでBoost使ってたらいろいろと苦労しそうだね。
Win32のことかー
>>958 例外使うところなのでは?
…それがいやなら結果入れる変数を参照渡し…
結果変数を渡すくらいならoptional使えばいいだろ
966 :
デフォルトの名無しさん :2007/10/20(土) 11:39:48
なにいってるんだ、NULL渡したいならnullptrだろ?
optionalあるんだからoptional使えばいいだろ
>>966 別に NULL を返したいんじゃなくて、
エラーが識別できれば何でもいいだろう。
まさに optional の適用事例。
boost.optionalごときにカリカリしすぎ
tupleでいいと思うけど人気無いの? 単にエラーコードと結果両方返したいだけなら tupleどころかstd::pairでもいいと思うけど。
>>970 それじゃぁ、エラーコードを不用意に無視することができてしまうだろ。
エラーコードを無視させにくくするためには optional みたいな
仕組みがいい。例外もエラーを無視させない仕組みなので、
例外を使ってもいいとは思うけど。故意に無視することができるのは
どちらも同じ。
optional を使ってエラー状態を通知する方法と
例外を使ってエラーの発生を通知する方法の違いは
直情より上の呼び出し元までエラー状態が伝搬するか否か。
>>970 俺もそう思う
std::map::insert が pair 返すし
tuple は tr1 にあるけど、optional は無いし
DefaultConstructibleでなくても返せるようにするために optionalは存在するんだ もっと勉強しろこのバカチンどもが!
全然関係ないけど 動的メモリがあまり自由でない環境だと、DefaultConstructibleでない 値ベースの型って、なにげに使い勝手が悪かったりするような
>>973 > tuple は tr1 にあるけど、optional は無いし
はい、スレ否定、来ました。
>>975 はいはい
boost::value_initialized
>978 value_initialized ってそういうもんだったっけ?と思ったらやっぱり DefaultConstuctible かどうかを解決なんてしないじゃん。 名前に惑わされてない?
auto_ptr + aligned_storage = optional
981 :
デフォルトの名無しさん :2007/10/21(日) 17:10:15
>>980 aligned_storageの説明ってどっかにあります?
982 :
978 :2007/10/21(日) 18:17:30
>>979 すいません。ご指摘のとおり。
default construtibleでない=組み込み型が初期値で初期化されない、
と勘違いしてました。
>>981 説明っていっても、指定サイズの char バッファを指定アライメントに置くだけだよ。
BoostにもTR1にも入ってる。
今の実装だと type_with_alignment<> 経由で求まる型を使ってるけど、
C++0x では alignof/alignas あたりを使うようになると思われる。
組み込み分野で便利そうだね 今まではマクロ使ってたけど
シンビアンとか、Mac OS Xのドライバとか、 組み込みっぽい用途に結構使われてるからね。
Boostを普通にプロジェクトで使ってる?
>>987 全部じゃないけど使っているクラスもある。
たとえば boost::shared_ptr とか boost::auto_array とか。
ああ、C++0x の auto がまちどおしい。 型名が長くなりすぎ。推論してくれ・・
これ以上コンパイル時間が長くなるのはイヤです
そこで8コア並列コンパイル Linuxのカーネルのビルドもカップ麺ができるまでに終っちゃいます
VS2005 は、何コアまで対応しているんですか?(コンパイル)
>>992 並行してビルドできるプロジェクトは任意に指定できるんじゃね?
つーか、型推論で速度が遅くはならねぇだろ。
いやいやそんな事は無い
>>996 しっかりしろ。sizeofがある時点で、typeofのようなものは簡単に実装できるなんてわかりそうなもんだろ。
そして、sizeofでコンパイル速度が落ちるか?
auto a = hoge(); これでaの型を推論するのに時間がかかるわけがない。 これでコンパイル速度が遅くなるんなら、下の簡単なテンプレート関数でも遅くなるだろ。 template<class T> void foo(T t){} foo(hoge());
?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。