トップページ⇒tech
1001コメント289KB

Boostを語れゴラァ part2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/02/07(火) 20:53:54
語って.はぁと part boost::mpl::int_<2>

前スレ
BOOSTを語れゴラァ
http://pc8.2ch.net/test/read.cgi/tech/1091198276/
0002デフォルトの名無しさん2006/02/07(火) 20:54:30
■関連サイト■
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/


■関連書籍■
Boost C++ Libraryプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4798007862/

Beyond The C++ Standard Library
http://www.amazon.co.jp/exec/obidos/ASIN/0321133544/

C++ Template Metaprogramming
http://www.amazon.co.jp/exec/obidos/ASIN/0321227255/

The Boost Graph Library
http://www.amazon.co.jp/exec/obidos/ASIN/0201729148/
0003デフォルトの名無しさん2006/02/07(火) 20:54:46
■関連スレ■
C++相談室 part46
http://pc8.2ch.net/test/read.cgi/tech/1136690107/

【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
0004デフォルトの名無しさん2006/02/07(火) 21:00:26
で、BOOTSの方との兼ね合いはどうすんのよ。
0005デフォルトの名無しさん2006/02/07(火) 21:03:57
削除依頼出してこようと思いますがそれで良いですか?
0006デフォルトの名無しさん2006/02/07(火) 21:05:05
ん〜Lokiも入れてほしかったよ
0007デフォルトの名無しさん2006/02/07(火) 21:23:17
>>6
Lokiもここでやりましょう。
0008デフォルトの名無しさん2006/02/07(火) 21:37:52
Loki
http://sourceforge.net/projects/loki-lib/
JTC1/SC22/WG21 - The C++ Standards Committee
http://www.open-std.org/jtc1/sc22/wg21/
0009デフォルトの名無しさん2006/02/07(火) 21:45:36
>>5
賛成
0010デフォルトの名無しさん2006/02/08(水) 00:30:54
>>1乙
0011デフォルトの名無しさん2006/02/08(水) 00:36:05
>>5
賛成

「Loki とか入れろ」って声があったんだから、命名についての議論はともかく、
せめて「Boost/Loki を語れゴラァ」ぐらいにしとけよ…。>>1 は阿呆かね。
0012デフォルトの名無しさん2006/02/08(水) 01:01:32
>>11
そんなこと言い出すんだったら、

「汎用性のあるテンプレートライブラリを語れゴルァ」でいいんじゃないかと。
0013デフォルトの名無しさん2006/02/08(水) 01:14:02
C++用ライブラリを語れゴルァ、がいい。
0014デフォルトの名無しさん2006/02/08(水) 01:18:24
じゃあOTLについて語ろうぜ
0015デフォルトの名無しさん2006/02/08(水) 01:19:45
>>13
じゃ、MFCについて語ろうぜ。
0016デフォルトの名無しさん2006/02/08(水) 02:37:27
Boostを語れゴルァ(Lokiもあるよ)
0017デフォルトの名無しさん2006/02/08(水) 03:11:09
boostくらいは名前に入れてくれないと検索にひっかからん
0018デフォルトの名無しさん2006/02/08(水) 04:05:43
MPL本が翻訳されないからLokiで止まってるんだろうな
5年前だぞあれ。いまさら何に使うんだと
0019デフォルトの名無しさん2006/02/08(水) 04:26:45
MPLはボロいコンパイラでも動くように作られてるのでダサい
0020デフォルトの名無しさん2006/02/08(水) 08:50:58
boost::program_options って変態的だけどすてき。
0021デフォルトの名無しさん2006/02/08(水) 11:24:33
>>12
だから、前スレでそういう流れになってたのに >>1 がこんな名前で
スレ立てたんだろう。
0022デフォルトの名無しさん2006/02/08(水) 11:26:48
俺はこのスレタイでいいと思うぞ。
0023デフォルトの名無しさん2006/02/08(水) 13:26:35
Loki はシンプルでテンプレートの学習用にはベストだけど、ちょっと古い。

Boost.MPL.Bind や、Boost.MPL.Iterator、Boost.TypeTraits、Boost.Phoenix2
といった複雑かつ強力なライブラリには劣り、現状でBoost には存在しない
Loki.Singleton や、Loki.SmartPtr も、より強力なものが、Sandbox で開発中だし。

正直、スレタイにLokiはイランだろ
0024デフォルトの名無しさん2006/02/08(水) 14:43:13
xpressiveも、結構バイナリサイズ大きくなるなあ。
インストールがいらない分、regexよりお手軽なのはいいけど。
0025デフォルトの名無しさん2006/02/08(水) 17:11:12
重複すれなので削除依頼出してきました。
http://pc8.2ch.net/test/read.cgi/tech/1139266461/l50
0026デフォルトの名無しさん2006/02/08(水) 17:16:46
thread.erase(std::remove_if(thread.begin(), thread.end(), _1 == >>25), thread.end());
0027デフォルトの名無しさん2006/02/09(木) 05:59:42
boost::multi_arrayはアグリゲートじゃまいのか...

0028272006/02/09(木) 22:37:39
boost::arrayを再帰的に使えばいいんかな
int a[2][2] = {{0,1},{2,3}};
boost::array<boost::array<int,2>,3> b = {{ {0,1} ,{2,3} }};//2次元以上だと{}が一つ必要ぽ
こんな感じでいけた
0029272006/02/09(木) 22:38:25
boost::array<boost::array<int,2>,2>
だった...orz
0030デフォルトの名無しさん2006/02/11(土) 18:38:21
なんで __fastcall がやたらと指定されているんだろ。
0031デフォルトの名無しさん2006/02/11(土) 19:19:27
シリアライゼーションの機能があるということで
ワクテカしているんですが、boost/serialization/ 以下のファイルと
boost/archive/ 以下のファイルって何か関係があるんでしょうか?

とりあえず boost/serialization/string.hpp を include
してみたんですが、boost::serialization::access なんていう
関数は見つからないし。
0032デフォルトの名無しさん2006/02/11(土) 19:29:27
>>30
スタック操作が少なくて済むから。
0033デフォルトの名無しさん2006/02/11(土) 19:35:03
>>32 __fastcall なんてできねーよ!
ってワーニング出されてもスピード気にしなければ
無視ってしまっておk?
0034デフォルトの名無しさん2006/02/11(土) 20:01:23
>>32
IA32に限れば滅多に減らない希ガスるけどな。
0035デフォルトの名無しさん2006/02/11(土) 20:16:09
>>34
x86, MMX, XMM各3つまでならレジスタ渡し可能(VC++の場合)
0036デフォルトの名無しさん2006/02/11(土) 20:29:43
>>35
どう指定すればそこまで最適化してくれるの?
0037デフォルトの名無しさん2006/02/11(土) 20:34:06
>>36
関数に__fastcall付けるだけ。
だがコールと共に寿命が切れる値でもないと、結局スタックに退避する事になる。
0038デフォルトの名無しさん2006/02/11(土) 20:40:20
普通に__fastcall付けるだけなら、x86レジスタしか使ってくれないんじゃ。
0039582006/02/11(土) 20:48:01
>>33
あげんなボケ。
このスレは永遠に下げ進行なんだよ。
二度とあげんな。ハゲッ
0040デフォルトの名無しさん2006/02/11(土) 21:46:56
>>39
オマエモナ
0041デフォルトの名無しさん2006/02/11(土) 22:10:44
ヒント:mmintrin.h
0042デフォルトの名無しさん2006/02/12(日) 05:34:51
Boost に、ハッシュ関数コレクションのようなも乗ってありましたっけ?
CRCからSHA1 までよりどりみどり、みたいな。
0043デフォルトの名無しさん2006/02/12(日) 11:30:20
まだ無いと思う
。これはどの方式かね?

ttp://www.boost.org/doc/html/hash.html
0044・∀・)っ-○●◎- ◆Pu/ODYSSEY 2006/02/12(日) 12:07:59
>>42
Crypto++にありそうな気が。

>>43
それはテーブルルックアップ探索用です。リレーショナルデータベースが使ってるやつ。
たとえば文字列なら数文字をパッキングして辞書順になるような数字に変換して検索するだけかと。
0045デフォルトの名無しさん2006/02/13(月) 20:27:14
BOOST_PP_CATで
BOOST_PP_CAT(::, elem)
のようにして::elemと結合させたいのですが、
pasting "::" and "elem" does not give a valid preprocessing token
とエラーが出てしまいます。
ここで、elemはさらに別のマクロに展開されます。
このように、::を含むようなケースで、うまく結合させるにはどうすればいいかご教示ください。
0046デフォルトの名無しさん2006/02/13(月) 23:54:13
>>45
まず、 :: elm じゃ何がダメなのかを説明して欲しい。
0047デフォルトの名無しさん2006/02/14(火) 01:02:29
ためしてねーけど、

#define GLOBALNAMESPACE( x )\
:: x

とか
0048デフォルトの名無しさん2006/02/14(火) 03:59:48
>>46-47
::直後にホワイトスペースが許されるのは知りませんでした。ありがとうございました。

…という以前に、::elemと続けて書いても展開されました。
難しく考えすぎてたようです(鬱
0049デフォルトの名無しさん2006/02/16(木) 07:35:30
vc8でいくつかビルドが失敗するんだが、漏れだけ?
0050デフォルトの名無しさん2006/02/16(木) 08:55:12
なんともなく使えてる
VS 2005 Pro
0051デフォルトの名無しさん2006/02/16(木) 09:03:32
SDK が付属していない Express だといくつか失敗すると思われ
0052デフォルトの名無しさん2006/02/16(木) 09:18:27
>>51 あ、そうかも。

っていうか、 >>49 は環境とエラーメッセージを
もっと詳しく書け。もしくは Boots スレに行け。
0053デフォルトの名無しさん2006/02/16(木) 09:59:03
ブーツ行きかよw
0054デフォルトの名無しさん2006/02/16(木) 10:42:21
boost::serialization って、実行時型情報を要求する?
なんか実行時型情報つかうのって好みじゃなくて。
って、じゃぁ、Boost を使うなよ!って言われそうだが
0055デフォルトの名無しさん2006/02/16(木) 10:49:35
interface_oarchive& から basic_oarchive& へ
dynamic_cast している個所があって、
これだけのために RTTI を要求しているようなんだが、
そもそもこんなキャストをしないような実装にはできなかったんだろうか。
0056デフォルトの名無しさん2006/02/16(木) 10:56:00
>54
てか
>なんか実行時型情報つかうのって好みじゃなくて。
なんで好みじゃないん?
0057デフォルトの名無しさん2006/02/16(木) 10:58:30
>>56 プログラム全体にわたっての型の整合性は
コンパイルが通った時点で保証されている、と信じたいから
0058デフォルトの名無しさん2006/02/16(木) 11:23:12
あと、serialize() を仮想関数にする事で
boost::smart_cast を使わない実装にできそうな気がするから。
気がするだけだけど。

ちなみに、コード眺めてると、
BOOST_SERIALIZATION_BASE_OBJECT_NVP() マクロを
使わなければ、smart_cast も必要なさそうな気がする。
気がするだけだけど。

そんな気がする今日この頃。
0059デフォルトの名無しさん2006/02/16(木) 12:42:06
馬鹿だなお前。馬鹿すぎる。
0060デフォルトの名無しさん2006/02/16(木) 13:17:13
↑どう馬鹿なのか質問したら答えられなくてファビョりそうw
0061デフォルトの名無しさん2006/02/16(木) 14:38:49
テンプレートな仮想関数なんて作れるの?
0062デフォルトの名無しさん2006/02/16(木) 14:42:57
>>61
作れない。
0063デフォルトの名無しさん2006/02/16(木) 14:43:08
>>61
仮想関数はメンバテンプレートになれない。
0064デフォルトの名無しさん2006/02/16(木) 19:29:38
>>54>>55>>57>>58はスルーしてください。> 賢者
0065デフォルトの名無しさん2006/02/16(木) 21:42:52
っていうか、>>57 みたいなこと書くやつは死ねばいいと思う。
お前みたいなド素人がプログラミングでメシ食っていこうなんて百年早い
マジ死ねよ
0066デフォルトの名無しさん2006/02/16(木) 21:45:48
>>65
57の感覚自体はまともだと思うけど
0067デフォルトの名無しさん2006/02/16(木) 21:47:29
つーか初級本卒業でなったつもり君でしょ。
0068デフォルトの名無しさん2006/02/16(木) 21:50:14
>>66
お前も死ねよ。ド素人が
0069デフォルトの名無しさん2006/02/16(木) 21:56:10
>>68
何で?
静的型システムってC++の気に入ってる点のひとつなんだけど
0070・∀・)っ-○●◎- ◆Pu/ODYSSEY 2006/02/16(木) 22:21:35
会社のx64マシンに入れようとしたらwaveがスタックオーバーフローでビルド失敗する。
0071デフォルトの名無しさん2006/02/16(木) 22:50:34
クラス作者が提供してないserialization機能が、
静的型システムで済むわけがないだろ。
そういう文脈で>>57なんて狂気の沙汰としか思えない。
0072デフォルトの名無しさん2006/02/16(木) 22:59:09
>>71 いや、Boost の serialization 機能は、
シリアライズしたいクラスに対して
friend class boost::serialization::access;
して、さらに

template <class Archive>
void serialize(Archive, const int);

メソッドを実装する必要があるのです
(そうでない場合はシリアライズしたい
クラスメンバをすべて public にする)。

ですので、クラス作者が実際のシリアライズ操作を
実装することが前提なので、その指摘は間違っています。
007357=722006/02/16(木) 23:05:57
あと、これは Boost とは関係ない話なのですが、
なぜ >>57 のように思ったかというと、dynamic_cast で
基底クラスを派生クラスにダウンキャストするということは、
派生クラスによって異なる振る舞いをさせたいから、
ということであり、そういうことは本来仮想関数で
実現するべきだろう、と思ったからです。

素人とか狂気とか言われる理由が分かりません。
0074デフォルトの名無しさん2006/02/16(木) 23:39:57
RTTIの有無についての議論は、今に始まった話じゃないし。
標準化のときも結構もめたんじゃないのかな。

禿の意見は確か、

ある言語にある機能がない場合、PGはそれを自作しようとする。
それなら言語仕様に入れたほうが、まだコストがましになるのではないか。

とかC++の設計と進化で言っていた気がする。
0075デフォルトの名無しさん2006/02/16(木) 23:43:11
>>74
文法がどんどん変態的になっていくのはその理念のせいか(w
0076デフォルトの名無しさん2006/02/16(木) 23:46:29
そのおかげでJavaと違っておもしろいんだよな
0077662006/02/17(金) 00:19:38
>>71
了解
一応言っとくと66はserialization云々の文脈を無視した上でってことね
0078デフォルトの名無しさん2006/02/17(金) 03:18:10
>>61
作れないが次のような物はどうだ。
struct Empty{};
template <typename T,typename Base=Empty>
class FooImpl:public Empty{
public:
  virtual void foo1(Foo1 & arg){
    (T *)this->bar(arg);
  }
  virtual void foo2(Foo2 & arg){
    (T *)this->bar(arg);
  }
};
class Bar:public FooImpl<Bar>{
  template <typename T>
  void bar(T * arg){
    //...
  }
}

一応テンプレート関数のような動作をする(受け取れる型などに制限ができるが)関数が作れる。
個人的にはテンプレートの動作速度や型が余分な型変換を削ったりできる場合もあると思うし(doubleとfloat用の仮想関数を2つ作ったりしても1つの記述ですむとか)
使い道事態はあるかな・・・と。
0079デフォルトの名無しさん2006/02/18(土) 14:33:14
>>78
え?お前コレ何の役に立つと思ってんの?

class Goo:public FooImpl<Goo>{template <typename T>void bar(T * arg){}}

他にこのようなGooクラスを作るとする。
スーパークラスは、それぞれFooImpl<Bar> と FooImpl<Goo>で、
同じスーパークラスじゃないから、これらを同一的に扱えない。

じゃあ、Barから派生するか?
class Too:public Bar{template <typename T>void bar(T * arg){}}

これで、FooImpl<Bar>*として同一的に扱える。
しかし、Too::barは呼ばれず、Bar::barが呼ばれる。


お前の案は糞の役にも立たない。使い道自体も当然無い。
もうちょっと頭使えよ。
0080デフォルトの名無しさん2006/02/18(土) 19:22:21
>>79
ではこのように訂正
struct Base{
  virtual void foo1(Foo1 & arg)=0;
  virtual void foo2(Foo2 & arg)=0;
};
template <typename T,typename Base_=Base>
class FooImpl:public Base_{
public:
  typedef Base_ Base;
  void foo1(Foo1 & arg){
    (T *)this->bar(ar);g
  }
  void foo2(Foo2 & arg){
    (T *)this->bar(arg);
  }
};
class Bar:public FooImpl<Bar>{
  template <typename T>
  void bar(T * arg){
    //...
  }
}

0081782006/02/18(土) 19:49:34
次のようなベースクラス・インプリメント用テンプレートクラスがあったとして
struct Base{
  virtual int funcint(int arg)=0;
};
template <typename T,typename Base_=Base>
struct BaseImpl:public Base_{
  int funcint(int arg){
    return (T *)this->func(arg);
  }
};
次のように変更するとする
class Base{
  virtual int funcint(int arg)=0;
  virtual BigInteger funcBigInteger(BigInteger arg)=0;
};
template <typename T,typename Base_=Base>
struct BaseImpl:public Base_{
  int funcint(int arg){
    return (T *)this->func(arg);
  }
  BigInteger funcint(BigInteger arg){
    return (T *)this->func(arg);
  }
};

さて、この両方の仮想関数はほとんど同じような動作をする。
こういうときに両方の型に対してコードが生成されるため、
コードをBigInteger用に増やさなくてもヘッダーファイルに手を加えるだけでBigInteger用の実装が簡単に作れるようになる。
そして、この仕組みを入れたとしても実行時の速度に全く悪影響を与えない(コンパイル時間は別だが)
速度と汎用性のトレードオフでどうするべきか判断付かない時に入れるといざというときに役に立つと考えているし。
汎用性を最初から優先する場合でも速度に配慮する場合に役に立つだろう。
0082デフォルトの名無しさん2006/02/18(土) 23:55:54
( ゚д゚)ポカーン
0083デフォルトの名無しさん2006/02/19(日) 08:36:42
反論できないと顔文字に逃げるってホントなんだな
0084デフォルトの名無しさん2006/02/19(日) 08:40:30
どう見ても荒しだろ。
0085デフォルトの名無しさん2006/02/19(日) 15:04:05
例の基地外?
0086デフォルトの名無しさん2006/02/19(日) 15:34:32
>>83-85
おまえらの脳ミソがへんなんだよ。
どのように見ても、>>81のソースは仮想テンプレート関数にはなってないだろ。
これなら、SFINAE使う方向で考えたほうがましなのを作れるぞ。
0087デフォルトの名無しさん2006/02/20(月) 03:24:54
「どのように見ても」
どのように見たの?
0088デフォルトの名無しさん2006/02/20(月) 10:27:32
  ∧_∧ ̄||ヽ、
 (    ) ||_| ←こんな感じ
 (__ つ三_ |
 /__ヽ) || ||
  _||_J || ||
0089デフォルトの名無しさん2006/02/20(月) 12:06:13
boost::program_options が好きだ。
変態的だけど。

-m {1|2|3} みたいな感じで動作モードを指定する
パラメータを処理したいときって、内部的には
enum にしててもやっぱコマンドラインでは整数で
与えるしかないのかな?なんかもっとスマートな方法内?
0090デフォルトの名無しさん2006/02/22(水) 17:14:27
「コマンドラインでは整数で与えるしかないのかな?」
の意味がようわからんのでなんとも。
自前でパースすればどうだってできるとしか。
0091デフォルトの名無しさん2006/02/23(木) 23:57:05
regex_iterator
コールバック書かなくて済むからいいね。

0092デフォルトの名無しさん2006/02/27(月) 01:58:44
センセー!
boost regexのサンプルgrep.cppのコンパイル方法がわかりません!
Vine Linux 3.2 の g++でコンパイルしています!
0093デフォルトの名無しさん2006/02/27(月) 03:08:44
signalをstd::vectorに突っ込めないのは仕様?

ソース見てみるとsignalはnoncopyable継承してるみたいだから、
vectorで要素確保するときにコンストラクタ起動できなくてエラーが起こるみたいだけど。

ちなみにboost::arrayに突っ込む分には問題なかったっす。

環境:VC2005 + boost 1.33.1
0094デフォルトの名無しさん2006/02/27(月) 03:14:54
標準のコンテナは、signalに限らず不便を生じる。まあ仕方ない。
0095デフォルトの名無しさん2006/02/27(月) 17:40:23
>>93
signalをboost::functionへ突っ込んだらどう?
0096デフォルトの名無しさん2006/02/28(火) 11:24:52
つーか、ptr_vectorが追加されただろう。それ使えや
0097デフォルトの名無しさん2006/02/28(火) 12:17:12
ptr_vector は 1.32 くらいから?
0098HelpME2006/02/28(火) 15:59:15
MacOSXでBoost使ってる人いますか?
Boostってユニバーサルバイナリに出来るんでしょうかね?

BoostのライブラリってBoostJamっていう専用の
ライブラリビルドツールを使ってビルドするので
自分でMakeファイル作ってビルドって出来ませんよね。

PowerPC用、intel用にそれぞれ
BoostJamで吐き出されたBoostライブラリ群を
lipoコマンドでマージするしかないっすかね?

たすけて〜〜〜〜!
0099デフォルトの名無しさん2006/02/28(火) 21:03:00
>98
bjamは内部でgccとかを呼び出してるだけ。
自分で適切なMakefile書けばコンパイルできないこともない。
0100デフォルトの名無しさん2006/02/28(火) 22:35:27
bjamはようするに独自に作ったmakeのようなもの。
0101・∀・)っ-○●◎- ◆Pu/ODYSSEY 2006/02/28(火) 22:50:29
IA用とPPC用で別々にビルドして後でバンドルの中身弄っちゃ駄目か?ww
■ このスレッドは過去ログ倉庫に格納されています