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

Boostを語れゴラァ part5

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

過去スレ
part 4 http://pc11.2ch.net/test/read.cgi/tech/1175663346/
part 3 http://pc11.2ch.net/test/read.cgi/tech/1158991211/
part 2 http://pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 http://pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■
Boost C++ Libraries
http://www.boost.org/

Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/

Let's Boost
http://www.kmonos.net/alang/boost/

boost info
http://shinh.skr.jp/boost/
0338デフォルトの名無しさん2008/01/14(月) 05:07:10
STLを使うのと同じ理由じゃいかんのかな。
0339デフォルトの名無しさん2008/01/14(月) 08:45:01
Boostはもう便利と言うより無いと不自然なライブラリになってる
効率上げると言うより無いと効率下がる
いまさらshared_ptrもfunctionもutilityもoperatorsもcstdintも無しで済ませるのは苦痛だ
0340デフォルトの名無しさん2008/01/14(月) 09:22:08
>>326
超頻出の Strategy パターンとか、大体 new が必要になるよね。
必要ない事もありはするけど。
shared_ptr や ptr_container があるだけで、メモリ管理がだいぶ楽になる。
0341デフォルトの名無しさん2008/01/14(月) 10:08:58
ptr_list に delete してほしくないポインタを渡すことはできますか?
0342デフォルトの名無しさん2008/01/14(月) 10:11:14
boostを使わないって?
使いこなせる人間がわずかしかいないって?(勉強はしないの?)
こういうことだから日本のIT産業は
0343デフォルトの名無しさん2008/01/14(月) 11:21:35
>>341
コンテナを渡すといいよ
0344デフォルトの名無しさん2008/01/14(月) 11:22:59
>勉強はしないの?

勉強する香具師は少数派
0345デフォルトの名無しさん2008/01/14(月) 11:22:59
>>341
ptr_container系はデストラクト時に必ず要素をdeleteする。
嫌ならデストラクト前にdeleteしてほしくないメンバをコンテナから削除しないと駄目。
0346デフォルトの名無しさん2008/01/14(月) 11:30:29
業務系はboostを勉強する暇があったら資格取れって話になるからな。
資格さえあれば仕事もついてくるって構図だから仕方ないけど。
0347デフォルトの名無しさん2008/01/14(月) 11:54:48
>>343>>345
大体分かりました。
その制限を踏まえて色々考えてみます。
0348デフォルトの名無しさん2008/01/14(月) 12:43:05
>>340
普通メンバ変数として確保しておいて、切り替え時にインターフェイス用のポインタを切り替えるだけだな。
いちいち new するとかタコすぎる
0349デフォルトの名無しさん2008/01/14(月) 12:46:16
まあ、そうやるときもあるけども、
new した方がいい時も多い。
0350デフォルトの名無しさん2008/01/14(月) 12:47:26
>>339
なんかさ、開発効率って、結局そういうところで決まらなくね?
むしろ、>>328 のようなことの方が影響大きいと思うのだが。
0351デフォルトの名無しさん2008/01/14(月) 12:49:46
だいたい、メモリ管理なんてそんなに面倒か?
メモリリークなんて、リソースリークも含めてここ数年出したことねぇなぁ。
設計がおかしいんじゃね?
0352デフォルトの名無しさん2008/01/14(月) 12:55:06
自分の世界しか見えてない人多すぎ
0353デフォルトの名無しさん2008/01/14(月) 13:39:37
面倒だからjava、C#はGCを実装したんだろ
0354デフォルトの名無しさん2008/01/14(月) 14:48:47
GCは便利だね。だけどあれはメモリコンパクションあってのものだと思うよ。
メモリコンパクション無しで、しかも参照カウンタで管理だなんて、存在価値なくね ?
0355デフォルトの名無しさん2008/01/14(月) 14:58:47
Boostを知らない者はC++を知らない (自明)
C++を知らない者はCを知らない (templateはマクロでvirtualは関数ポインタだった)
Cを知らない者はプログラミングを知らない (自明)

対偶を取ろう
プログラミングを知る者はBoostを知っている
0356デフォルトの名無しさん2008/01/14(月) 15:05:47
ど頭から真理でないやんけ
0357デフォルトの名無しさん2008/01/14(月) 15:07:58
たしかに、templateはマクロで仮想関数は関数ポインタだが、
だからといって、どうして、「C++を知らない者はCを知らない」ということになるんだ?
普通逆だろ。
「C++のtemplateと仮想関数は、元々はCのマクロと関数ポインタであるので、
C++の元となったCを理解していないと、C++を理解したということにならない。」
となるのが普通だろ。

(自明)とか使ってる時点で釣りなんだろうが。

0358デフォルトの名無しさん2008/01/14(月) 15:15:50
>>355 乙
危うく納得するところだった。
こういう詭弁はなんと命名されているのだろうか?個別性質と集合抱合のすり替え?
0359デフォルトの名無しさん2008/01/14(月) 15:27:01
要はこういうこと。

偽: 「C があったから C++ が生まれた。」
真: 「C++ が生まれたのは、C があったから。」

C++の基礎としてCがあるのであって、Cの拡張としてC++があるというわけではない。
「Cの拡張としてC++がある」というのは一見正しそうだが、単なる結果論に過ぎない。
マンガの見すぎ、精神論、文系脳。
ただ単に、「C++の基礎としてCがある」という事実があるだけ。
これがロジカルな思考、現実、理系脳。
0360デフォルトの名無しさん2008/01/14(月) 16:38:26
>>359
論理学・集合論的に説明してくれないと.....。
0361デフォルトの名無しさん2008/01/14(月) 16:43:49
>C++ が生まれたのは、C があったから。
表現を簡単にしすぎて誤解しやすい表現になってる気が。
0362デフォルトの名無しさん2008/01/14(月) 16:51:57
>>359
どう見ても「理系」の推論方法ではないな。そもそも「理系」という言葉を使う時点でアウトだ。
>>355 は一種のジョークだ。
0363デフォルトの名無しさん2008/01/14(月) 18:00:43
C++ is not PreProcessor = C++(cpp)
0364デフォルトの名無しさん2008/01/14(月) 18:14:18
とりあえずD&Eでも読んでみるか
0365デフォルトの名無しさん2008/01/14(月) 18:19:09
Object-Perlとか
Object-COBOLとか
そりゃもう悲惨だからな
0366デフォルトの名無しさん2008/01/14(月) 20:09:11
322の言うとおりならc++なんぞ使わずにcでいいじゃねぇかと思う今日この頃
newの無いc++なんざcとかわらん
0367デフォルトの名無しさん2008/01/14(月) 20:40:18
>>326
scoped_ptr
0368デフォルトの名無しさん2008/01/14(月) 22:11:49
>>367
scoped_ptr ってあれ一体何に使うの?
スコープはずれたら解放するってんなら、初めからスタックの上に確保すりゃいいんじゃね ?
それともマルチスレッド対策 ?
0369デフォルトの名無しさん2008/01/14(月) 22:14:15
>>366
逆に C++ で new とか使いまくるぐらいなら、C++ なんぞ使わずに Java 使えばいいのにと思う。
0370デフォルトの名無しさん2008/01/14(月) 22:22:28
>>368
new したポインタを返すような関数から返されてきたポインタを受けるときとか。

>>369
placement new を使った効率的なメモリ管理を選択する事もできるから、
C++ には C++ なりの利点がある。
0371デフォルトの名無しさん2008/01/14(月) 22:26:50
>>368
pimplで使う
0372デフォルトの名無しさん2008/01/14(月) 22:44:36
>>370
>new したポインタを返すような関数から返されてきたポインタを受けるときとか。
C++ でそんなことするやつ居るのか。
素直に Java 使えよ。

>placement new を使った効率的なメモリ管理を選択する事もできるから、
placement new と smart_ptr って相性悪くね ?
0373デフォルトの名無しさん2008/01/14(月) 22:47:23
>>370
>new したポインタを返すような関数から返されてきたポインタを受けるときとか
それはどちらかというとauto_ptrだと思う。
scoped_ptrはswapはできるけど(auto_ptr的な意味での)releaseができないから、
呼び出し側が他の方法でdelete管理をしたい時困る。

>>368
pimplとかfactoryパターンの生成物とか。
0374デフォルトの名無しさん2008/01/14(月) 22:48:53
さっきから同一人物っぽいが、なんでポインタの扱い方がどうこう程度でJavaに乗り換えなきゃならんのだ。
その程度の理由で乗り換えないし乗り換えられない状況だって腐るほどあるだろうに。
0375デフォルトの名無しさん2008/01/14(月) 22:50:36
C++ 使わずに C 使えば ?
って言われたから、じゃぁ Java 使えば ?
って言い返しただけだよ。
0376デフォルトの名無しさん2008/01/14(月) 22:53:45
とりあえずJavaはNGワードの方向で
0377デフォルトの名無しさん2008/01/14(月) 23:01:27
>>373
auto_ptr は次期 C++ で deprecated になります。
0378デフォルトの名無しさん2008/01/14(月) 23:12:10
PCベースの人と組み込み(寄り)の人じゃメモリに関する認識が
ぜんぜん違うから、どこまでいっても平行線
0379デフォルトの名無しさん2008/01/14(月) 23:18:12
Java はデストラクタがないから
リソース管理が面倒。
0380デフォルトの名無しさん2008/01/14(月) 23:24:05
>>377
うまくいけば代わりにunique_ptrが入る。
0381デフォルトの名無しさん2008/01/15(火) 03:24:54
unique_ptrってauto_ptrで削除子を決めれるようになっただけ?
0382デフォルトの名無しさん2008/01/15(火) 14:22:11
move への対応が一番大きい進歩ではないかと
0383デフォルトの名無しさん2008/01/15(火) 18:52:21
Deleter 指定可
explicit operator bool() 装備
代入でmoveはできず、std::move()が必要

こんなとこだっけ?
まあ似たようなもの2つあると初心者は混乱しそうだが
0384デフォルトの名無しさん2008/01/20(日) 11:36:15
boost::ptr_list<Hoge> a, b; があったとして、
b の内容全てを a の後ろに移動したいのですが、
そういうことはできますか? 出来る限り簡単な方法で。
0385デフォルトの名無しさん2008/01/20(日) 12:29:25
よくわからないけど
std::copy とか使えないのかな
0386デフォルトの名無しさん2008/01/20(日) 13:04:05
一応1つの方法として
常に false を返す比較関数を使って merge する方法は思いつきましたが、
何かエレガントじゃないというか・・・。

>>385
コピーじゃなくて移動なんです。
a の最後に b の要素を付け加えて b は空にしてしまう、という形ですが、
内部的には単なるノードのつけかえで実現されるのがベストです。
0387デフォルトの名無しさん2008/01/20(日) 13:38:59
splice
0388デフォルトの名無しさん2008/01/20(日) 15:08:07
ptr_list には splice がないようですが、
代わりに transfer というのがありました。
ありがとうございました。
0389デフォルトの名無しさん2008/01/21(月) 23:08:31
cmakeにFindBoostてコマンド追加されたらしい
http://www.cmake.org/Bug/view.php?id=6257
これでboostのpathをmakeに書かなくてもよくなったのかな
0390デフォルトの名無しさん2008/01/22(火) 00:26:18
____
|← reject|  boostの中の人  singleton   ユーザー
. ̄.|| ̄ ̄        ┗(^o^ )┳(`Д´)┳(^o^ )┛≡=-
  ||            ┏┗   ┗┗  ┏┗ ≡=-
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0391デフォルトの名無しさん2008/01/22(火) 01:05:59
嫌がってるじゃないかw
0392デフォルトの名無しさん2008/01/22(火) 02:08:26
boost には配列サイズを取得するマクロとかないんですか?
0393デフォルトの名無しさん2008/01/22(火) 02:23:18
>>392
つ配列使わずにコンテナを使う
0394デフォルトの名無しさん2008/01/22(火) 02:28:24
そんな気もしてましたが、やっぱりそうなのですか・・・。
0395デフォルトの名無しさん2008/01/22(火) 02:37:11
>>392
Boost.Preprocessorにそんなようなマクロがあったような気が・・・
0396デフォルトの名無しさん2008/01/22(火) 03:12:46
boost::rangeにあるsize関数ならコンパイル時決定ではないが簡潔。
0397デフォルトの名無しさん2008/01/22(火) 05:22:38
え〜?singleton がリジェクト?
[review] General comment on boost::singleton
http://www.nabble.com/-review--General-comment-on-boost::singleton-td14952506.html
Tobias Schwinger
http://torjo.com/tobias/
これでつか?(T^T)
0398デフォルトの名無しさん2008/01/22(火) 05:36:26
シングルトン「うはwwwboostなんつー変態ライブラリ入りなんて死んでもお断りwwwwww
一生孤独でおkwwwwwwシングルトンだけにwww」

俺「\(^o^)/」
0399デフォルトの名無しさん2008/01/22(火) 06:00:18
単純なデザインパターンだけど実装はいろいろあって大変なのかな
0400デフォルトの名無しさん2008/01/22(火) 06:27:47
>>399
完全な、あるいは既知の欠陥がないSingletonライブラリを実装するのはほとんど不可能ってレベルで。

大体BoostでSingletonが蹴られたのってこれで何度目だ?
0401デフォルトの名無しさん2008/01/22(火) 06:33:15
boostはsseに対応していますか?
0402デフォルトの名無しさん2008/01/22(火) 09:21:54
Singletonは言語レベルで実装してくれないと苦しい部分が多いと思う。
0403デフォルトの名無しさん2008/01/22(火) 10:47:25
シングルトンはグローバル変数同然っていうよく聞く話があって、それを推奨するような
ライブラリの提供という点で否定的なレビューが多くあがってた。

作者によると今回の singleton は、スレッド安全な動的初期化と、はっきりした
初期化順や破棄タイミングを提供するらしいけど、否定的な人たちに言わせれば
それらをシングルトンとは関係ない個別の機能として提供すべきだとか、そういう話。

元はこっちの巨大なスレッドね。
http://www.nabble.com/-review--Fast-track-review-of-Boost.Utility-Singleton-begins-today-to14806433.html
0404デフォルトの名無しさん2008/01/22(火) 12:30:29
で,自分はこれを使っているんだけど
http://www.boost.org/libs/pool/doc/implementation/singleton.html
やっぱり details 以下のものを使うのは良くないのかなぁ.
0405デフォルトの名無しさん2008/01/22(火) 12:50:47
提案としては悪くないんだけど、
何でもぶちこみすぎているから分解を検討しましょうってことだよね。
0406デフォルトの名無しさん2008/01/22(火) 19:45:28
プロパティにブレークポイント置けるだけで
グローバル変数よりは随分マシだけどね。
0407デフォルトの名無しさん2008/01/23(水) 19:02:33
最近lambda使い出したモノです。

struct Foo
{
  int var;
};

vector<Foo*> vData;

...vDataの中身をいろいろ埋める

sort(vData.begin(), vData.end(), _1->var < _2->var); ←コンパイルエラー

これって実現方法あります?
これ以上複雑に書かないとだめなら普通に述語書いたほうがいいような気がする・・・
vectorがFooのポインタなのは実装上の理由です。
0408デフォルトの名無しさん2008/01/23(水) 20:27:52
bind(&Foo::var, _1) < bind(&Foo::var, _2)か_1->*&Foo::var < _2->*&Foo::var
0409デフォルトの名無しさん2008/01/23(水) 21:15:54
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).

0410デフォルトの名無しさん2008/01/28(月) 11:30:59
>206
今更ながらいただきました。thx!
自力コンパイルする前にこのスレ覗いてよかった。
0411デフォルトの名無しさん2008/01/28(月) 15:15:52
>>410
どういたしまして.ただビルドしておいてるだけですが.
同僚から ICU 対応は?とか,もっとアップデートしろ
とか突き上げ食らってまして,そのうちまた新しいもの
置いておきます.
0412デフォルトの名無しさん2008/01/29(火) 01:48:44
>>411

私も今いただきました。
私もスタティックだけを使うのでありがたいです。
/MT /MTd で作成されているのですよね!?
0413デフォルトの名無しさん2008/01/29(火) 02:21:41
>>412 >>207
0414デフォルトの名無しさん2008/01/29(火) 06:56:25
>>412-413
説明不足ですみません.
>>207 はそこに置いてある他のライブラリ(gmp とか mpfr とか)
で特に記述のないものは /MD, /MDd でコンパイルしています
ということで,boost に限って言えば bjam が /MT /MTd /MD /MDd
のすべてに関してビルドしてくれます.さらにオートリンクにより
適切なものが選ばれます.詳しくは boost/config/auto_link.hpp
を見てください.

余談ですが,自分がデフォルトを /MD /MDd にしている理由は
マネージドと混在させたい場合が時々あるからです.
/MT /MTd でコンパイルしたコードはマネージドと混在できません.
04154112008/01/29(火) 07:50:47
Boost のバイナリだけ独立したページにしました.
http://svn.windy.cx/ から辿ってください.
あと,直リンクしやすいようにダウンロードを PHP 経由ではなくしました.
別にダウンロードされた回数とかカウントする必要ないので.
何かおかしいところがあったらここか上のWikiのコメント欄にでも.
0416デフォルトの名無しさん2008/01/29(火) 18:37:51
boost.guid ってどうなったんだっけ?
0417デフォルトの名無しさん2008/01/29(火) 18:52:13
実装にセキュリティ上の問題があるとかで、見送られたんじゃなかったっけ。


Windowsだと、簡単に世界で一意なGUID生成できるので、
Windowsでしかプログラミングしない自分としては、あんまりいらないな。
0418デフォルトの名無しさん2008/01/29(火) 19:11:14
あれってWindows以外もあるヘテロな環境でもOKなの?
0419デフォルトの名無しさん2008/01/29(火) 19:59:36
urn:uuid なんかの RFC を読むと GUID じゃなくて UUID
って名称を使ってるんだよね.名称をどっちにするか
っていう話も出てた気がする.

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

};

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

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

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

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

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

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

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

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

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

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

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

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

void DoSomething2(shared_ptr<SuperFoo> p);
ではなくて
void DoSomething2(shared_ptr<SuperFoo> &p);
だったのがまずかったようです。
参照をやめたら通るようになりました。
0433デフォルトの名無しさん2008/02/01(金) 13:15:53
豆知識
非constな参照引数に一時オブジェクトは渡せない
0434デフォルトの名無しさん2008/02/01(金) 13:27:43
さらに豆知識
VisualCに限り可能だったりする
0435デフォルトの名無しさん2008/02/02(土) 23:31:20
もうひとつ豆知識
関数の呼び出し式でスマートポインタを構築すべきでない
DoSomething3(shared_ptr<Foo>(new Foo), bar());
だと引数の評価順序は不定なのでnew Foo→bar()で例外送出→shared_ptr構築されず→メモリリークになる可能性がある
0436デフォルトの名無しさん2008/02/02(土) 23:37:36
そういえばそうだったな
引数の評価順序が不貞とか直感に反するふざけた仕様だよな
0437デフォルトの名無しさん2008/02/03(日) 00:34:33
&& か || をオーバーロードして引数の評価順序をちゃんと常識的な社会の貞操ルールに従えさせるものでもつくりませう
■ このスレッドは過去ログ倉庫に格納されています