1 :
デフォルトの名無しさん :
2006/02/07(火) 20:53:54
で、BOOTSの方との兼ね合いはどうすんのよ。
削除依頼出してこようと思いますがそれで良いですか?
ん〜Lokiも入れてほしかったよ
>>5 賛成
「Loki とか入れろ」って声があったんだから、命名についての議論はともかく、
せめて「Boost/Loki を語れゴラァ」ぐらいにしとけよ…。
>>1 は阿呆かね。
>>11 そんなこと言い出すんだったら、
「汎用性のあるテンプレートライブラリを語れゴルァ」でいいんじゃないかと。
C++用ライブラリを語れゴルァ、がいい。
じゃあOTLについて語ろうぜ
Boostを語れゴルァ(Lokiもあるよ)
boostくらいは名前に入れてくれないと検索にひっかからん
MPL本が翻訳されないからLokiで止まってるんだろうな 5年前だぞあれ。いまさら何に使うんだと
MPLはボロいコンパイラでも動くように作られてるのでダサい
boost::program_options って変態的だけどすてき。
>>12 だから、前スレでそういう流れになってたのに
>>1 がこんな名前で
スレ立てたんだろう。
俺はこのスレタイでいいと思うぞ。
23 :
デフォルトの名無しさん :2006/02/08(水) 13:26:35
Loki はシンプルでテンプレートの学習用にはベストだけど、ちょっと古い。 Boost.MPL.Bind や、Boost.MPL.Iterator、Boost.TypeTraits、Boost.Phoenix2 といった複雑かつ強力なライブラリには劣り、現状でBoost には存在しない Loki.Singleton や、Loki.SmartPtr も、より強力なものが、Sandbox で開発中だし。 正直、スレタイにLokiはイランだろ
xpressiveも、結構バイナリサイズ大きくなるなあ。 インストールがいらない分、regexよりお手軽なのはいいけど。
25 :
デフォルトの名無しさん :2006/02/08(水) 17:11:12
thread.erase(std::remove_if(thread.begin(), thread.end(), _1 ==
>>25 ), thread.end());
27 :
デフォルトの名無しさん :2006/02/09(木) 05:59:42
boost::multi_arrayはアグリゲートじゃまいのか...
28 :
27 :2006/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次元以上だと{}が一つ必要ぽ こんな感じでいけた
29 :
27 :2006/02/09(木) 22:38:25
boost::array<boost::array<int,2>,2> だった...orz
なんで __fastcall がやたらと指定されているんだろ。
31 :
デフォルトの名無しさん :2006/02/11(土) 19:19:27
シリアライゼーションの機能があるということで ワクテカしているんですが、boost/serialization/ 以下のファイルと boost/archive/ 以下のファイルって何か関係があるんでしょうか? とりあえず boost/serialization/string.hpp を include してみたんですが、boost::serialization::access なんていう 関数は見つからないし。
33 :
デフォルトの名無しさん :2006/02/11(土) 19:35:03
>>32 __fastcall なんてできねーよ!
ってワーニング出されてもスピード気にしなければ
無視ってしまっておk?
>>32 IA32に限れば滅多に減らない希ガスるけどな。
>>34 x86, MMX, XMM各3つまでならレジスタ渡し可能(VC++の場合)
>>35 どう指定すればそこまで最適化してくれるの?
>>36 関数に__fastcall付けるだけ。
だがコールと共に寿命が切れる値でもないと、結局スタックに退避する事になる。
普通に__fastcall付けるだけなら、x86レジスタしか使ってくれないんじゃ。
39 :
58 :2006/02/11(土) 20:48:01
>>33 あげんなボケ。
このスレは永遠に下げ進行なんだよ。
二度とあげんな。ハゲッ
40 :
デフォルトの名無しさん :2006/02/11(土) 21:46:56
ヒント:mmintrin.h
42 :
デフォルトの名無しさん :2006/02/12(日) 05:34:51
Boost に、ハッシュ関数コレクションのようなも乗ってありましたっけ? CRCからSHA1 までよりどりみどり、みたいな。
>>42 Crypto++にありそうな気が。
>>43 それはテーブルルックアップ探索用です。リレーショナルデータベースが使ってるやつ。
たとえば文字列なら数文字をパッキングして辞書順になるような数字に変換して検索するだけかと。
BOOST_PP_CATで BOOST_PP_CAT(::, elem) のようにして::elemと結合させたいのですが、 pasting "::" and "elem" does not give a valid preprocessing token とエラーが出てしまいます。 ここで、elemはさらに別のマクロに展開されます。 このように、::を含むようなケースで、うまく結合させるにはどうすればいいかご教示ください。
>>45 まず、 :: elm じゃ何がダメなのかを説明して欲しい。
ためしてねーけど、 #define GLOBALNAMESPACE( x )\ :: x とか
>>46-47 ::直後にホワイトスペースが許されるのは知りませんでした。ありがとうございました。
…という以前に、::elemと続けて書いても展開されました。
難しく考えすぎてたようです(鬱
vc8でいくつかビルドが失敗するんだが、漏れだけ?
50 :
デフォルトの名無しさん :2006/02/16(木) 08:55:12
なんともなく使えてる VS 2005 Pro
SDK が付属していない Express だといくつか失敗すると思われ
52 :
デフォルトの名無しさん :2006/02/16(木) 09:18:27
>>51 あ、そうかも。
っていうか、
>>49 は環境とエラーメッセージを
もっと詳しく書け。もしくは Boots スレに行け。
ブーツ行きかよw
54 :
デフォルトの名無しさん :2006/02/16(木) 10:42:21
boost::serialization って、実行時型情報を要求する? なんか実行時型情報つかうのって好みじゃなくて。 って、じゃぁ、Boost を使うなよ!って言われそうだが
55 :
デフォルトの名無しさん :2006/02/16(木) 10:49:35
interface_oarchive& から basic_oarchive& へ dynamic_cast している個所があって、 これだけのために RTTI を要求しているようなんだが、 そもそもこんなキャストをしないような実装にはできなかったんだろうか。
>54 てか >なんか実行時型情報つかうのって好みじゃなくて。 なんで好みじゃないん?
57 :
デフォルトの名無しさん :2006/02/16(木) 10:58:30
>>56 プログラム全体にわたっての型の整合性は
コンパイルが通った時点で保証されている、と信じたいから
58 :
デフォルトの名無しさん :2006/02/16(木) 11:23:12
あと、serialize() を仮想関数にする事で boost::smart_cast を使わない実装にできそうな気がするから。 気がするだけだけど。 ちなみに、コード眺めてると、 BOOST_SERIALIZATION_BASE_OBJECT_NVP() マクロを 使わなければ、smart_cast も必要なさそうな気がする。 気がするだけだけど。 そんな気がする今日この頃。
馬鹿だなお前。馬鹿すぎる。
↑どう馬鹿なのか質問したら答えられなくてファビョりそうw
テンプレートな仮想関数なんて作れるの?
>>61 仮想関数はメンバテンプレートになれない。
65 :
デフォルトの名無しさん :2006/02/16(木) 21:42:52
っていうか、
>>57 みたいなこと書くやつは死ねばいいと思う。
お前みたいなド素人がプログラミングでメシ食っていこうなんて百年早い
マジ死ねよ
つーか初級本卒業でなったつもり君でしょ。
68 :
デフォルトの名無しさん :2006/02/16(木) 21:50:14
>>68 何で?
静的型システムってC++の気に入ってる点のひとつなんだけど
会社のx64マシンに入れようとしたらwaveがスタックオーバーフローでビルド失敗する。
クラス作者が提供してないserialization機能が、
静的型システムで済むわけがないだろ。
そういう文脈で
>>57 なんて狂気の沙汰としか思えない。
72 :
デフォルトの名無しさん :2006/02/16(木) 22:59:09
>>71 いや、Boost の serialization 機能は、
シリアライズしたいクラスに対して
friend class boost::serialization::access;
して、さらに
template <class Archive>
void serialize(Archive, const int);
メソッドを実装する必要があるのです
(そうでない場合はシリアライズしたい
クラスメンバをすべて public にする)。
ですので、クラス作者が実際のシリアライズ操作を
実装することが前提なので、その指摘は間違っています。
あと、これは Boost とは関係ない話なのですが、
なぜ
>>57 のように思ったかというと、dynamic_cast で
基底クラスを派生クラスにダウンキャストするということは、
派生クラスによって異なる振る舞いをさせたいから、
ということであり、そういうことは本来仮想関数で
実現するべきだろう、と思ったからです。
素人とか狂気とか言われる理由が分かりません。
RTTIの有無についての議論は、今に始まった話じゃないし。 標準化のときも結構もめたんじゃないのかな。 禿の意見は確か、 ある言語にある機能がない場合、PGはそれを自作しようとする。 それなら言語仕様に入れたほうが、まだコストがましになるのではないか。 とかC++の設計と進化で言っていた気がする。
>>74 文法がどんどん変態的になっていくのはその理念のせいか(w
そのおかげでJavaと違っておもしろいんだよな
77 :
66 :2006/02/17(金) 00:19:38
>>71 了解
一応言っとくと66はserialization云々の文脈を無視した上でってことね
>>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つの記述ですむとか)
使い道事態はあるかな・・・と。
>>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が呼ばれる。
お前の案は糞の役にも立たない。使い道自体も当然無い。
もうちょっと頭使えよ。
>>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){
//...
}
}
81 :
78 :2006/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用の実装が簡単に作れるようになる。 そして、この仕組みを入れたとしても実行時の速度に全く悪影響を与えない(コンパイル時間は別だが) 速度と汎用性のトレードオフでどうするべきか判断付かない時に入れるといざというときに役に立つと考えているし。 汎用性を最初から優先する場合でも速度に配慮する場合に役に立つだろう。
( ゚д゚)ポカーン
反論できないと顔文字に逃げるってホントなんだな
どう見ても荒しだろ。
例の基地外?
>>83-85 おまえらの脳ミソがへんなんだよ。
どのように見ても、
>>81 のソースは仮想テンプレート関数にはなってないだろ。
これなら、SFINAE使う方向で考えたほうがましなのを作れるぞ。
「どのように見ても」 どのように見たの?
∧_∧ ̄||ヽ、 ( ) ||_| ←こんな感じ (__ つ三_ | /__ヽ) || || _||_J || ||
boost::program_options が好きだ。 変態的だけど。 -m {1|2|3} みたいな感じで動作モードを指定する パラメータを処理したいときって、内部的には enum にしててもやっぱコマンドラインでは整数で 与えるしかないのかな?なんかもっとスマートな方法内?
「コマンドラインでは整数で与えるしかないのかな?」 の意味がようわからんのでなんとも。 自前でパースすればどうだってできるとしか。
regex_iterator コールバック書かなくて済むからいいね。
センセー! boost regexのサンプルgrep.cppのコンパイル方法がわかりません! Vine Linux 3.2 の g++でコンパイルしています!
signalをstd::vectorに突っ込めないのは仕様? ソース見てみるとsignalはnoncopyable継承してるみたいだから、 vectorで要素確保するときにコンストラクタ起動できなくてエラーが起こるみたいだけど。 ちなみにboost::arrayに突っ込む分には問題なかったっす。 環境:VC2005 + boost 1.33.1
標準のコンテナは、signalに限らず不便を生じる。まあ仕方ない。
>>93 signalをboost::functionへ突っ込んだらどう?
つーか、ptr_vectorが追加されただろう。それ使えや
ptr_vector は 1.32 くらいから?
MacOSXでBoost使ってる人いますか? Boostってユニバーサルバイナリに出来るんでしょうかね? BoostのライブラリってBoostJamっていう専用の ライブラリビルドツールを使ってビルドするので 自分でMakeファイル作ってビルドって出来ませんよね。 PowerPC用、intel用にそれぞれ BoostJamで吐き出されたBoostライブラリ群を lipoコマンドでマージするしかないっすかね? たすけて〜〜〜〜!
>98 bjamは内部でgccとかを呼び出してるだけ。 自分で適切なMakefile書けばコンパイルできないこともない。
bjamはようするに独自に作ったmakeのようなもの。
IA用とPPC用で別々にビルドして後でバンドルの中身弄っちゃ駄目か?ww
Boost の boost::archive::tmpdir って、 単に TMP,TMPDIR,TEMP 環境変数の値を見に行ってるだけなんだな。
boost::serialize で double をシリアライズするとき、 精度が一桁少ないと思うのはオレだけ?
Boost.Threadを用いたコードがコンパイルできません.下記のようなメッセージが出ます. /tmp/ccV99vjI.o(.text+0xa7): In function `main': boost_muti_thread.cpp: undefined reference to `boost::thread::thread(boost::function0<void, std::allocator<boost::function_base> > const&)' /tmp/ccV99vjI.o(.text+0x104):boost_muti_thread.cpp: undefined reference to `boost::thread::thread(boost::function0<void, std::allocator<boost::function_base> > const&)' /tmp/ccV99vjI.o(.text+0x13e):boost_muti_thread.cpp: undefined reference to `boost::thread::join()' /tmp/ccV99vjI.o(.text+0x14d):boost_muti_thread.cpp: undefined reference to `boost::thread::join()' /tmp/ccV99vjI.o(.text+0x163):boost_muti_thread.cpp: undefined reference to `boost::thread::~thread()' /tmp/ccV99vjI.o(.text+0x17a):boost_muti_thread.cpp: undefined reference to `boost::thread::~thread()' /tmp/ccV99vjI.o(.text+0x18e):boost_muti_thread.cpp: undefined reference to `boost::thread::~thread()' /tmp/ccV99vjI.o(.text+0x1ab):boost_muti_thread.cpp: undefined reference to `boost::thread::~thread()' collect2: ld はステータス 1 で終了しました 日本語のBoostの解説本に載ってたサンプルコードなのですが,コンパイルできませんでした. Fedora Core 4でg++を使っています.全てのBoostのライブラリをbuildできており,他のBoost を用いたコードでは問題ありませんでした. 何かアドバイスをお願いいたします.
何かライブラリが足りないっぽい
>>104 libboost_threadをリンクしなはれ
>>105 >>106 ありがとうございます.
# g++ thread1.cpp -pthread /opt/boost/lib/libboost_thread-gcc-mt.so
でコンパイルできました.
Intel C++ Compiler 9.0でBoost-1.33.1をビルドしたいのですが,ほとんどの ライブラリがビルドできませんでした.ビルドする方法があれば伝授頂きたい のですが. 環境はFedora Core 4(i386) + l_cc_c_9.0.030です. 以下のようにビルドを試みました. # export INTEL_PATH=/opt/intel/cc/9.0 # ./configure --with-toolset=intel-linux # make よろしくお願いいたします.
連投すみません. Boostの日本語コミュニティが無いので以前から疑問だったことを 教えてください. multi_arrayのオブジェクトをクラスのメンバにしたかったのですが, extents is not a typeというエラーが出てコンパイルできません でした. class HOGE [ private: boost::mutli_array<double,1>::extent_range range; boost::multi_array<double,1> x( boost::extents[range(1,10)] ); ................... }; こんな感じにしたいのですが,なぜかextentsでエラーが出ます. これはboostの仕様なのでしょうか?
boostっつーか、C++の仕様ですけど。
コンストラクタで初期化する。 class Hoge { private: boost::mutli_array<double,1>::extent_range range; boost::multi_array<double,1> x; public: Hoge() : x(boost::extents[range(1, 10)]) {} };
>>110 >>111 ご返答ありがとうございます.
C++は使い始めてから日が浅くあんまりよく
わかっていない状態で使ってました.
アンマネージドなオブジェクトに対してだけしか使えなくてもいいから、 C++/CLI でも使えるようにして欲しいよ。 boost::serialization と boost::program_options だけでもいいからさ
115 :
デフォルトの名無しさん :2006/03/03(金) 08:56:25
C++/CLI では関数呼び出しが __clrcall なんだけど、 boost では結構 __fastcall が使われている。 ヘッダだけで済む奴は問題ないんだけど、 *.cpp で提供されているやつは ライブラリ構築時に作ったオブジェクトで __fastcall が使われているから リンクしようとしたときに「だめだよ。」って優しくおこられる。 boost のビルドの時に __clrcall にしてライブラリ構築すれば いいんだろうけど、boost/config/auto_link.hpp まわりとか ライブラリ名とかどうすればいいのかな、と。 さらに boost のマニュアルに従って bjam 使ってインストール してるんだけど、bjam の中身をよく分かってないんで どうしたもんかと。
>>111 extent_rangeは静的メンバで十分だろ。
117 :
115 :2006/03/03(金) 10:45:59
とりあえず使いそうなライブラリだけ __fastcall やめにして リビルドしてみます。って、それだけで簡単にいくんだろうか。 そもそも C++/CLI 使ってるお前が悪いとか言われそうなんだけど。
>>117 C++/CLIだったらC#でいいじゃないかと本気で思うが。
そんなヤツがこのスレにいるかよ。 C++中毒患者のスレだ、ここは。
pin_ptr<T> 命!
もう原始帰納関数をコンパイル時に計算できるC++のtemplateじゃないと生きていけない。 しかし良くあんな事思いついたよな。
テンプレート考えた奴らもえらいとおもうが、 プリプロセッサつーもんが C に無かったら もしかしたら思い付かなかったかも知れんな。
マクロで汎関数や汎クラスを書いていた頃が懐かしいな。 特殊化ってのはこのマクロ展開そのものだもんな。
()をつけわすれて、えらいめにあったよ 演算子の優先順位の関係で 思いもよらぬお隣さんと演算されちゃったり
ど素人やん…
算数の段階のミスじゃん
Boostってなんでバイナリで配布してないの?
大部分のライブラリがヘッダのインクルードだけで済むから。
129 :
124 :2006/03/03(金) 23:56:04
いや、マクロ展開の結果思いもよらぬ結果に、 ってことだったんだが・・・・
130 :
127 :2006/03/03(金) 23:56:26
>>128 そういうことか。ありがと。
正規表現のとこだけでも公式でバイナリ配布してくれないかな・・・
*.libや*.dllにいろんなバージョンがあってサイズが大きくなるからでは? うちではlib以下全部で1.37GBだった。
>>127 山ほどあるコンパイラそれぞれにバイナリを作っていたらきりが無い。
そもそもお前はビルドしてできたlibファイルの大きさがどれくらいか知っているか?
俺のVC7.1でビルドしたもので1GiBytes以上ある。
133 :
131 :2006/03/03(金) 23:59:00
よく見たらvc版とmgw版とgcc版、さらに1.31と1.32が全部入ってたorz
VC++7.1用だけで560MBとかあるな。
135 :
127 :2006/03/04(土) 00:16:37
そんなでかいのか・・・。どうりでバイナリ配布がないわけだ。 うちのヘボマシンで、どれだけ時間かかんのかな・・・orz
そういえば、聞きたかったことがあるんだけど。 ビルドするだけで、インストールしなかった場合、 ディレクトリ構造が、よくわからなくなるんだけど……。 具体的に言うと bin\boost\libs\regex\build\libboost_regex.lib\vc-7_1\release の下に、 runtime-link-static threading-multi という、二つのディレクトリがあって、 なぜか、runtime-link-static\threading-multi なんてものもあるんだけど、マルチスレッドには、どちらを使えばいいんだろう。、 libboost_regex-vc71-mt-s-1_33_1.lib libboost_regex-vc71-mt-1_33_1.lib 微妙に名前が違う。 どちらも、スタティックリンクライブラリなんだけど。
俺の環境では↓こんだけだな、バイナリ・パッケージは。
libboost-date-time libboost-doc libboost-examples libboost-filesystem
libboost-graph libboost-iostreams libboost-program-options
libboost-regex libboost-serialization libboost-signals libboost-test
libboost-thread libboost-wave
>>129 それがど素人やねん
全体と引数を()でくくるのが80年代からの常識。
138 :
124 :2006/03/04(土) 00:28:02
VS2005(VC8)だが1.04GBある。正直驚いた。
2003+Boost1.32で1.17GB
141 :
136 :2006/03/04(土) 00:30:50
じつは、regexなどは、まだ使ったことがなかったんだけど。 ちょっと見てみたら、 runtime-link-static\threading-multi の方を使うみたいだ。 じゃあ、いきなりthreading-multiがあるのはなぜだろう。
オブジェクトファイルなんかは、実際に使う分には、いらないから、 必要なファイルだけとしても、やはり数百MBいきそうだな。
圧縮属性適用したら800MBくらいに縮んだ
Windowsだとハードリンクがコピーになって数倍のディスク食ってる悪寒
146 :
131 :2006/03/04(土) 00:40:58
vc71用のを重複除いてみたら118MBだった。これでも大きいな。 //ところでみんなinstallせずに使ってるの?
ないない。必要な時にテンポラリに展開されそうな気もするが、全部使う機会ってそんなに無いしなぁ。 てか、ぶっちゃけRegex++以外のプリコンパイルライブラリ使わない希ガス。 xpressive使い出したらRegex++すら不要に・・・。
Boost::Python使いの漏れは少数派ですか・・・
boost::program_options はプリビルト必要だな。
抜けてるレスが多いと思ったらあいつが来てるのか
>>145 WindowsでもNTFSにはハードリンクが存在する。
>>153 存在するのは分かってるけど、
インストール過程でそれを使ってくれない。
>>136 threading は single と multi,runtime-link は static と dynamic が
選択肢としてあります. MSVC ではこの 2*2=4 の組み合わせのうち
runtime-link が dynamic で threading が single な組み合わせがありません.
(一部のライブラリはさらに残りの3つの組み合わせの1部をビルドしません)
で, Boost のビルドでは threading が single, runtime-link が dynamic,
がそれぞれデフォルトで,デフォルトに対応したパスは省略されます.
例えば runtime-link-static というパスは,実際には
runtime-link-static\threading-single というパスの省略,といった具合です.
threading-multi は runtime-link-dynamic\threading-multi の省略です.
結果,その3つのディレクトリ構成になります.
で,どちらを使えばよいかというとそれは目的とするビルドによって
適切に決める,としか書きようが無いです.
例えばビルドで必要な他の全てのソースのコンパイルの
コンフィギュレーションとリンクする Boost のライブラリの
コンフィギュレーションを統一するというのがあって,
これが一番分かりやすく,かつ最もオーソドックスな方法かと思います.
>>154 あれ?少なくとも stage ターゲットだと NTFS のハードリンク使ってくれたように
記憶しているんですが……. install ターゲットは違うのかな?
なぜmulti_arrayは+とか-とかの基本的な演算をサポートしていないんだろう? 自分で実装しろってことなのかな?
>>156 algorithmを使え。
というか君、boostはまだ早くない? その前に標準STLを使いこなして!
>>156 が欲しいのはmulti_arrayじゃなくて
boost::numeric::ublas::matrixだったりしない?
>>156 です.
Boostのmulti_arrayにほしい機能があったのでSTLもあんまし
わからないままとりあえず使ってます.
>>158 使いこなすも何も役に立たないものばかり。たいてい中途半端なつくり。
STLを役に立たないとは剛毅だな。
>>156 std::vectorだって+も-もできないし、組み込みの配列型もそうだし。
boost::multi_arrayはただの配列。それ以上でもそれ以下でもない。
むしろ勝手にそんな演算子が定義されてたら困る。
数学の行列が使いたいなら
>>159 だし。
1次元ならstd::valarrayなんてのもあるな。
>>166 C++ではstd::transformが近いと思うよ。
ublas::vector_rangeってどんな場面で役に立つのかがイマイチよくわかりません. どなたか簡単な解説を…
数値計算で行列処理する時は、 部分行列を指定したり、部分行列を行列として扱いたいことあるでしょ。 これはvectorの一部分を指定したり、 それをあたかも別のvectorの様に扱う(vector_proxy)ためのクラス。
二次元、三次元のデカルト座標や極座標、ベクトルを取り扱う ためのクラスライブラリって、Boost にありますか? いままで自分用に作ったモノを使ってきたんだけど、 準標準のものがあるならそれを使うのもいいかなと思って。
>>173 ublas の vector じゃ駄目なのか?
>>174 ublasの"u"は何の略なんですか?
micro
>>176 おお、そっちの意味だったのか、だからuBLASって書いてあるのね。
178 :
171 :2006/03/14(火) 02:52:11
ublas に要素としてつっこめるクラスって何をみたしてなきゃならないの?
位置ベクトルとか速度ベクトルとか時刻とかその極座標系表現とか そのあたりを取り扱うのに便利なライブラリってないですか? しこしこ自分で定義した最低限の機能しかないクラスライブラリを 使ってるんですが、絶対みんな同じ事してるよぉ、と思ってます。
>>180 ublas の vector じゃ駄目なのか?
nanを検出する便利な機能とかがあれば教えてください.
>>182 boost じゃないけど、std::isnan() かな。
std::numeric_limits<double>::quiet_NaN() と == すればいいかとも思ったが、駄目っぽい…。
演算の途中でNaNが発生したら例外を投げるようなものが欲しいのかと思ったが。
>>184 だから std::isnan() が無いのか。
>>183 std::isnan() って VC++2005 には無い。
>>181 要素の次元まで考慮したいです。
間違って代入したりできないように。
速度ベクトルと位置ベクトルは
あくまで違うものとして扱いたいです。
次元までは扱えませんが、double 等を
BOOST_STRONG_TYPEDEF するという手も有りますね。
isnan はC99だからな
しかもマクロだ
isnan() の中身って、
>>184 みたに自分自身と比較してるのか
それともそれぞれのアーキテクチャの内部表現で見てるのかどっち?
規格上は特に規定されてない??
>>186 後出しで糞コンパイラのことなんか出すなよ…。
_isnan()
暇つぶしに、lambdaで遊んでいたのですが、こんなコードで悩んでいます。 std::vector<int> v(100) ; std::for_each(v.begin(), v.end() , boost::lambda::_1 = rand() ) ; すべての要素に乱数を代入したいのですが、 なぜか、すべてランダムな、ある値になってしまいます。 rand()が一回しか呼ばれていないようなのですが。 毎回rand()を呼ぶようにする方法はあるのでしょうか?
>>191 boost::lambda::bind を使う。
std::for_each(v.begin(), v.end(),
boost::lambda::_1 = boost::lambda::bind(rand)
);
あと、boost::generator_iterator を使えば、ファンクタを定義すれば
boost::lambda を使わなくてもいいと思う。
>>185 >演算の途中でNaNが発生したら例外を投げるようなものが欲しいのかと思ったが。
そう,そんなのがほしいです.なんかいい方法ありませんかね?
Signaling NaNのトラップハンドラを使う方法はダメ? _fpieee_flt()を使えば設定できるらしいけど。
64bitPentium4にRedHat9、Intelコンパイラ8.0を使っています。 boost-jamはどれをダウンロードしてインストールすればよいのでしょうか? それと、bjamのsTOOLSは何を指定すればよいのか教えてください。 よろしくお願いします。
サイトに普通に載ってるよ よくみるんだな
>>196 Intel Compiler 8.0を使う場合.
sTOOLS=intel-linux
でOK.あと,bjamを使わなくてもコンパイルできるよ.
./configure --with-toolset=intel-linux
でOKだったはず.ver.8.0じゃない場合はこの手順じゃだめだ.
199 :
デフォルトの名無しさん :2006/03/22(水) 17:38:55
uBLASのouter_prodって 外積じゃなくてテンソル積なんだな。 ちょっとツボった。ググってみると取り違えてるとこが幾つもあったし。 普通の外積は定義されてないかな? //線形代数の範囲を超えそうだけど
htp://www.rrsd.com/boost/libs/serialization/doc/tutorial.html#simplecase ここのサンプルをそのままコンパイル、実行したら oa << g; で、 mallocから例外がでてしまいます。 こんなことに陥った方いますか? もうわけわからんヽ(`Д´)ノ
コンパイラや boost のバージョンを言わないのは喧嘩売ってんのか?
もち
あたぼうよ!
なんだその態度は
ああん? なんか文句あんのか
はいはいワロスワロス
お前ちょっと表出ろやこら
表だぁ?さみーんだよ。
__ __ n _____ _____ ___ ___ ___ | | / / / / / | /__ __/ [][] _| |_| |__ _| |_ | |. / / /⌒ヽ/ / / ̄ ̄|. l / / | _ | |_ レ'~ ̄| | | / / ( ^ω^ ) / /. / / | |___  ̄| | / / / /| | | | / / ノ/ / ノ /  ̄ ̄ / \__| | |  ̄ /_ / | |_ | |. / / // / ノ / / ̄ ̄ ̄ |_| |__| \/ | |/ / ⊂( し'./ / / |. / | ノ' / / | /. し' ./ /  ̄ ̄ ̄  ̄ ̄
VIPに書くと、VIP臭くなるからやなんだよ。
寒いか?いや、それは俺の心か
何、気取ってんだゴルァ
いい加減、Bootsに話し戻せよ。
214 :
200 :2006/03/26(日) 05:13:37
すいません。 コンパイラはVisualC++.net 2003、 boostのバージョンは1_33_1です。
216 :
200 :2006/03/26(日) 05:57:53
本当に申し訳ありません。 RTTIを有効にしたら直りました。
もっと!
218 :
デフォルトの名無しさん :2006/03/26(日) 09:17:40
基底クラス class X; 派生クラス class Y : public X; virtual メソッドは無し。 デストラクタも非 virtual。 というとき、 shared_ptr<X> px(new Y) ってしたら、 px は最終的にどのデストラクタを呼びます? ちゃんと ~Y() を呼んでくれるのかなぁ。 仮想デストラクタにしておかないと ~X() を呼ぶだけ? 教えて Boost マスター!
自分で試せカス
boostがインストールされている場合とされていない場合で、コンパイルするコードを切り替えたいのですが、 #ifdefかなにかでやる方法はないでしょうか?
>>220 C++ では無理。
autotools のように、ヘッダの有無をチェックできるツールを使うべし。
>>218 new Y
なら大丈夫だけど
(X*)new Y
だとアウト。
shared_ptr は、その便利機能の代償として、 オブジェクトの破壊と構築に若干のコストがかかる。
さらに、enable_shared_from_this クラステンプレートから派生させることで ↓のようなことが平気で出来るようになる。 class X : public enable_shared_from_this< X > { int value; }; void func() { // Xを生成してスマートポインタにセット shared_ptr<X> p1( new X ); { // 生のポインタを取り出す。 X * pRaw = p1.get(); pRaw->value = 0; // ポインタから、スマートポインタを取り出す shared_ptr<X> p2 = pRaw->shared_from_this(); p2->value = 10; } assert( p1->value == 10 ); }
>>226 >shared_ptr<X> p2 = pRaw->shared_from_this();
これってすごく便利そうだし面白いけど、
実際に使うとなるとどうなんだろう?
途中でdelete p2; とかしちゃったりして
せっかくのスマートポインタの恩恵が半減してしまいそう・・・
operator delete()か何かを非公開にしてしまえばdeleteできない。
つーか
>>226 のコードの意図がわかんない。
enable_shared_from_thisってメンバ関数からthisポインタを
shared_ptr(またはweak_ptr)で渡すための苦肉の策でひょ。
Cスタイルの関数に、スマートポインタで保護されているオブジェクトを 渡したいときとかに有効だよ。あまりいい例じゃないが↓ struct thread : public enable_shared_from_this< thread >{ static shared_ptr<thread> create( function1< void, shared_ptr<thread> > pr ){ return shared_ptr<thread>( new thread( pr ) ); } static shared_ptr<thread> current_thread(){ void * p = current.get(); return ( p == 0 ) ? shared_ptr<thread>( new thread ) : static_cast< thread * >( p )->shared_from_this(); } private: static tls current; // 現在のスレッドを保存するためのスレッド固有領域 thread( function1< void, shared_ptr<thread> pr ) : proc( pr ){ hnd = _beginthreadex( ..., this ); // スレッドパラメータとして自分を渡す } static unsigned STDCALL threadproc( void * p ){ thread * self = static_cast< thread * >( p ); current.set( self ); // 現在のスレッドを保存 self->proc( self->shared_from_this() ); return 0; } ... }; void myproc( shared_ptr<thread> p ){ assert( p == thread::current_thread() ); } int main(){ shared_ptr<thread> p = thread::create( myproc ); p->join(); }
え?shared_from_this()ってのは、 自身のメンバ関数から、自身のスマートポインタを返す時のために作られた、苦し紛れな方法だろ? class T{ public: shared_ptr<T> self(){ return shared_ptr<T>(this); } // 参照カウンタが複数できてバグる、アウト! }; class T : public enable_shared_from_this<T>{ public: shared_ptr<T> self(){ return shared_from_this(); } // セーフ };
>>231 230みたいにほかの使い方をしてもいいだろ。
あんなブサイクな方法がいいと思ってんなら、個人の自由だし別にいいけど
論理を出せないが引っ込みもつかないので仕方なく煽り始めた模様
>>234 え?なになに、悔しかったの?
こんくらいで煽られたとかいってんのかぁ。無菌室で育ったのかなぁ…。
もしくはゆとり教育のせいか…。
今日のニュースで高校教科書策定の話が出てたけど、
それは「脱ゆとり」を目指して作られたらしいよ。
もう一度高校生からやりなおしてみるのはどうだろうか?
enable_shared_from_this という名前がすべてを語っていると思う。 トリッキーな使い方をするのは自由だけれども。
なんかよく分からんけど、thisからshared_ptrが取れたら便利なケースってあるじゃない。 なんか不味いの?
例えば?
>>230 のような例になってないのは勘弁してくれな
いや、だから自身のスマートポインタを他オブジェクトに配りたい場合とか。
そうしたいということ自体が苦し紛れだ!って話?
別に
>>230 みたいなのでもいいと思うけど、嫌なの?
struct hoge { auto_ptr<thread> th; hoge(thread * t) {th.reset(t);} }; try{ auto_ptr<thread> th(new thread(...)); hoge x(th.get()); th.release(); }catch(...){ ... } ってやらないと、スレッド関連はいろいろマズいんじゃないの?
まぁ、enable_shread_from_this を使うような場所では オブジェクトに参照カウントを持たせて、intrusive_ptr を使うべきではある。 で、counted_base から派生させると楽だったんだけど、 counted_base は非推奨になってしまったのでそういうのは自前で 用意しないといけないが。
243 :
237 :2006/03/30(木) 21:47:23
>>242 やっぱりintrusive_ptrにするのが筋なのかぁ。
shared_ptrはよく使うけど、intrusive_ptrはほとんど使ったことないんだよね(面倒くさくて)。
thx。調べてみます。
>>241 ものすごく悔しかったみたいだから許してあげて。
この手のものはちゃんとどういう風に実装されてるか理解して使うべきだよ。 ブラックボックス的に便利だからと使うのはちょっと危険。
しかし例えばboost::MPLを読み解けと言われるとちょっと困る 何あのマクロの嵐
247 :
デフォルトの名無しさん :2006/03/30(木) 23:02:33
Boostの功罪を少し語れ
つ コンパイル時間
日本人は低能知能なのには呆れますね。 私達中華人民はあなたたちの掲示板を拝見して笑ってみてますよ。ではありがとうございました。
功:まあ面白い、はたから見る分には 罪:しらん。使ったらろくな目にあわないだろう事は目に見えてるから、スルーしてるし
今のC++でboost使わない奴は大アホ。センス無し
あおりのセンスねえな
boostよりいいライブラリ持ってるからboost使う必要無いんだが
うp
買ってこいとか言われるに3カノッサ
中途半端な連中はソース公開しない方が良いよ 恥ずかしいしね
>>259 どんな下手くそなコードだろうと、本人がこっ恥ずかしいコードだろうと。
自分と違う考え方が表記されてるので常に参考になるものだ。
>>260 激しく同意。
まぁプログラミングに限らない話だけど。
下手なレスを書いてる奴が下手なコードくらいで恥ずかしがっちゃ駄目だよな。>俺
263 :
デフォルトの名無しさん :2006/04/06(木) 10:05:11
正規表現の置換で2パス以上かかる処理を 1パスにまとめる機能ってないんでしょうか? a...(略)... b... A...(略)... B...
>>263 > a...(略)... b...
> A...(略)... B...
この例の意味がわからんが、
s/a\(.*\)b/A\1B/ ってことなのか?
266 :
263 :2006/04/06(木) 11:31:35
>>264 (a|b)でマッチさせたときに
置換文字列で順序付きでA、Bを指定できるようなイメージのつもりで書きました。
regex_iteratorの正規表現に(a|b)を指定させて
コールバックさせればいいのは分かるのですが、
置換文字列の方でそのような方法は確立されてないのでしょうか?
いません
269 :
263 :2006/04/06(木) 16:50:10
>>268 できました、ありがとうございます。
(なぜかデフォルトの引数のmatch_defaultだけだととだめでした。)
boost::regex_replace(std::string("abc"),boost::regex("(a)|(b)"),"(?1A)(?2B)",boost::match_default | boost::format_all);//ABc
[a-z] -> [A-Z]
にしたいときはやっぱり
"(a)|(b)|.....(z)"
"(?1A)(?2B).....(?26Z)"
というおそろしい事態になってしまうのでしょうか?
>>269 の冒頭が
「なぜか、ありがとうございます」
に読めて無意味にワロタww
272 :
263 :2006/04/07(金) 15:58:35
>>270 正規表現マッチ部分の置換をファンクタ指定できないぽ・・・
template <typename IteratorT,typename OutIteratorT,typename RegexT,typename ReplaceFnT>
void ReplaceRegexCopy( IteratorT ,IteratorT ,OutIteratorT ,const RegexT& ,ReplaceFnT);
template <typename MatchResultT,typename OutItr,typename NumT> void Replace(....);
ptr_vectorに constポインタを入れるとき,みんなどうしてる? vc 7.0 でコンパイルすると, boost::ptr_vector<const int*> pVect(1); const int* i =new const int(1); pVect.push_back(i); // コンパイルエラー pVect[0] = i; // OK となるのだが…
あー,俺アホだ・・・. orz
275 :
デフォルトの名無しさん :2006/04/12(水) 09:16:24
Boost 新バージョンまだ〜チンチン ところで、boost::program_options で インタラクティブなモードがあったら便利だなぁ、とか思いません? いまはオプションの値をコマンドラインと設定ファイルから供給することが できるわけですが、インタラクティブにキーボードから受け付けてくれるとべんりだなぁ。 あ、でも画面制御が必要なら curses とか使うハメになるから Boost の枠内では無理なのかな。別に画面制御が必要な方式じゃなく、 単にライン読み込みでいいんだけどな。
276 :
デフォルトの名無しさん :2006/04/12(水) 09:40:25
277 :
デフォルトの名無しさん :2006/04/12(水) 17:24:08
CppUnit と Boost のユニットテストライブラリと でrftgyふじこpl
イタレータの終了条件となる特別なイタレータって、 コンテナだと、こんてな.end()で得て、 イタレータだとイタレター名()でコンストラクトってことになってるけど、 boost::iterator::filter_iteratorはend()を持っています。 どうしてなんでしょうかね?
要素を飛ばすタイプのイテレータアダプタは, 自分が止まるべき場所を知っていないとまずい場合があるからです. 実際に作ってみればすぐ分かりますが, 最後の要素のいくつかが filter_iterator の条件に合致した場合, filter_iterator が終了場所を知っておかないと increment において overrun してしまいます.
いたれたーな
全部end()にしとけばよかったのにな。
165 :デフォルトの名無しさん :2005/12/05(月) 02:37:52
ここんとこC++でいやいや仕事させられてるんで変なライブラリとかも見る機会が
あるんだが、BOOSTとか見ると何であんな複雑怪奇なことをしてGeneric Programmingに
取り組んでいるのか理解に苦しむ。素直にLisp/Scheme使えばいいのに・・・
アレは理解できない・というよりしたくない。エラーメッセージもわけわからんし、
修正→コンパイル→デバッグのサイクルに費やす時間が異常に長いしで不毛なことこの上なし。
166 :デフォルトの名無しさん :2005/12/05(月) 03:40:22
>>165 確かに boost の lambda は笑った。すべてをコンパイル時にやろうという
C++ の執念は凄いが、実用性は?だよね。
>>282 Lisp/Scheme が素直だとは言えない環境も多くある。
ネイティブバイナリが必要なマイナーな環境でも
C++ と boost で Generic Programming の恩恵が受けられる。
十分な実用性だと思うよ。
>>283 そこまでして C++ で偽 Generic Programming をやること自体が実用的だろうか、
という問題提起だろ。環境云々は別にして。
Generic Programming 自体が目的(そういう状況が想像できないけど)なら別だが。
>>284 Generic Programming をすると実用性が下がるという前提がおかしい。
ま、Lisp系から見たら単なる「Generic風」でしかないからねぇ。 あんな中途半端な機能で生産性が向上したりプログラムが読みやすくなったり するのか、という意味での実用性だよ。速度的なペナルティは少ないからいわゆる 実用プログラムで使っても何ら問題はないと思うけど、使おうという気が起きない。
>>287 もちろんC++のテンプレート一般の話ではなく、Boostのlambdaの話ね。
その例は知ってるけど、正直言って実際に仕事のプログラムで使おうという気は
起きなかった。C++でここまでできるんだという面白さはあるし、ある意味Boost
らしいなとも思うけどね。
templateを関数内で宣言できるだけでもいいのになぁ…… ローカルクラスが普通のクラスと同じように扱えるだけでも十分です……
>>286 CLOSのdebugもたいがい苦しいが。
daemon methodやcall-next-method駆使してある
他人のプログラムは追っていてもわけがわからなくなるよ。
boost::lambdaで一番困るのは、
何故コンパイルエラーになるかすぐに分からない時。
3行くらいになる型同士を比較したり。文句言う人がいるのも分かる。
C最強
Lispって遅過ぎてビジネス向きじゃ無いよ 研究室で遊んでる分には楽しいけどね
>>292 もっと遅い言語がいっぱいビジネスで使われている現状は無視するのね
294 :
292 :2006/04/25(火) 23:10:33
Lispの速度の話をするなら、最近のcmuclの性能でも調べてから発言したほうが恥を
かかんと思うぞ。
>>293 はPerlとかPHPとかRubyとかPythonとかそういう系だろ。
MMX/SSE Intrinsicsのようなコンパイラ拡張(とはいえC++のインライン関数展開などに依存している) まで考慮すれば速度的にC++を超える言語なんかアセンブラ/機械語だけだろ。
Cを速度的に超える言語はアセンブラ/機械語だけだが、 C++を速度的に超える言語はいくつかあると思う。 某サイトのベンチマークではHaskellよりも遅いと出てるし、 速度的にはCとC++は分けて考えないと。
>>293 Javaが遅いのは許せるがLispが遅いのは許せない
>>295 PerlとかPHPとかRubyとかPythonは、言語というよりWeb向けのスクリプトでしょ
Lispと比べてどうする?
C++は(本当はCも、だけどC++は特に)使い方次第でしょ。 言語自体の問題とコンテナ等ライブラリの実装の問題も分けて考えないと。
Lispをビジネス用途に採用するにはRiskがあるんだよねえ
>>300 そうだよね
C++なんて幾らでもパフォーマンスを上げられるよね
生産性は落ちるかもしれないけどね、まあトレード・オフって奴だ
>>299 最近のビジネスアプリケーションの多くがそういう「スクリプト言語」で記述されて
いるのは事実だぜ。
>>301 速度云々よりもランタイム環境(ライセンスなども含めて)の問題が大きいかもね。
そんなあなたたちにD言語でしょ。
Dは論外。 開発できるツールとして成立してないじゃん。
D使うくらいならC#でいいや。w
プログラマなんて最終的には一山いくらの世界だから、 その言語を使える人間が簡単に確保できることがもっとも重要なのさ。
boost::lexical_castでは+52.0000E-03のような文字列は数値に変換できないのですか?
少なくともVC++7.1では printf("%E\n", lexical_cast<double>("+52.0000E-03")); で、 > 5.200000E-002 と表示されたが。
gccのtypeofって標準にならないのか?
たまにはLokiも使ってやれ
Lokiはもう忘れ去られたよ
Lokiはすでに役目を終えた
ロキでも無かった
Lokiは優れたライブラリだったけど、バージョンアップしないから 忘れ去られたな。 一人で作ってるライブラリだとこうなることが多い。
LokiはSingletonHolderだけ使ってる 似たようなのが他にあればそっちを使っても良いけど
おいらもLoki::SingletonとLoki::Factoryを使っている。 SingletonはBoostでも作成中みたいだけど、どうなったんかね?
Loki::GenScatterHierarchyは初めて見たときは驚愕した
boost、singleton作ってるの? どんなんなるか早く見てみたいな
最近、久しぶりにC++に戻ってきたんでBoostの日本語サイトチェックしたんだけど もう2年以上更新が止まってるんだね もう日本語サイトは用済み? みんな本家を見てるの?
>>322 テコ入れに君が翻訳に参加すれば状況は変わるお。
頑張ってくれ、応援してるお。
>>322 ツール使ってジェネれートされたhtmlソースを見たら
翻訳する気が失せた。
326 :
322 :2006/05/04(木) 22:43:38
>>323 Javaだと皆直接英語を見ることが多いなあ
インド人とかと仕事する機会が多いことも英語への拍車をかけてるかも
>>324 Javaだと例えばJBossとジェロニモが覇権争いをしてる、みたいな感じでイノベーションに
休む暇が無いって感じなのにね
JavaからC++に来て思ったのがデザインパターン知ってる人がおそろしく少ない点
知っててもホントに基本的なsingletonとかfactoryとかその程度だし
>>326 昔の話だから今はどうか知らないけど、Javaの場合、日本語訳がウンコだったてのもあるからじゃない?
328 :
322 :2006/05/04(木) 22:51:39
でも俺はC++の方が可能性を感じるよ 優秀な奴がプログラムすると素晴しいものができる、と信じてる 最も成功してるGoogleとかは、開発にC++使ってんのかなあ?
C++にもJavaのeclipseのようなIDEがあればいいんだが、 無いからな。
331 :
328 :2006/05/04(木) 23:35:13
>>330 俺は使ってると信じてるよ、間違い無く使ってるはずだと
Google的なイノベーションを起こすのはC++だってね
だからC++に可能性を感じてるんだが
でもGoogleの基盤システムのソースコードを読んでないから確信のままなんだけどね
でもこれからのイノベーションはこっちの方向なんだろうね
優秀なプログラマは複数の言語を知っていて使い分けている。 プロのプログラマでC++を知らなきゃモグリだが、すべてをC++で済ませてたら無知だ。
いや、C++はほとんどすべてのことをC++ですませられる万能言語だよ。 その意味ではC以外で一番の言語だろ。
>333 「すませられる」と「適している」は別モンだろうが。
>>332 SQLやHTMLを全く知らない職業プログラマとか結構の割合で見るけど、どう思う?
まぁ、「俺は組み込み系一筋です」ってヤツとかならわからんでもないけど、
そうでもないのにSQLやHTMLを知らないようなヤツは、俺は勘弁してくれって思う。
あと、Windowsの基本的な操作すら理解していない職業プログラマとかもいまだにいたりすんだよなぁ。
何でおまいここに居るの、みたいなレベルの低い奴多いよね 人月単価の弊害かもね、レベルの低い連中を淘汰できないのは
俺なんて最近Boostで一番よく使ってるのがboost::pythonだぜ。w
>>336 まぁ、よくでる話ではあるけど、やっぱりプログラマって免許制にでもして
あまりにもレベルの低すぎるヤツだけでもこの業界から追放して欲すぃ。
他に就く職業がないからって理由だけで人手不足のこの業界を喰い物する連中を誰か排除してくれ〜
>>339 うちはそんなの雇わないからへっちゃら。君んとこの人事がアホなだけ。
××試験の結果と役に立つかどうかは別物だから、おそらく免許制は無意味。
足きりは出来るでしょ。 学歴と一緒。
>>340 所謂、「足切り」するだけでも全然違うって。
でも、人手不足という現状からそーいったことが現実に行われることはないだろうけどね。
>君んとこの人事がアホなだけ。
反論のしようがございません。orz
いいかげんスレタイを読んで欲しいな。
boostにsingleton libraryってのがあったんだな Singleton library written by Jason Hise was NOT accepted in Boost. ってなったみたいだけど。 なんというか、boostにないのが不思議なくらい必要不可欠な 機能なんだから早く問題解決してsandboxにでもいいから 入れてほしいな
必要不可欠? ダメだコイツ、典型的なsingleton症候群だ。
>>344 > Date: 2005-05-23 16:52 +900
> they uncovered several weknesses in current design and implementation.
だけど、それから新しいの出てないよね。
>SQLやHTMLを全く知らない職業プログラマとか結構の割合で見るけど、どう思う? C++プログラマてきには仕事ではHTMLとか少ないんだろ。 それに、あんなもんてきとーなレベルなら勉強するまでも無く使えるだろ。 できないって言ってるのはやりたくないだけ。 それより、SQLっつーかDB。iBATISのC++版みたいなのない? 灰羽とかのような厨くさいのはいらないから
>>347 > てきとーなレベルなら勉強するまでも無く使える
あー、これ便利な言い方ですよね。
「てきとー」の内容次第で色んなものに対してこう言うことができる。
結局何も言っていないのと同じですが、パッと見はそう見えない。便利便利 :-)
HTMLってツールが吐き出すものだろ?
350 :
デフォルトの名無しさん :2006/05/05(金) 17:49:43
SQLもツールあったような希ガス あと、なんとなくageとくよ
適当なラベルのレスを書き込むスレはここですか?
おまえらJava厨につられすぎwww
やっぱC++版のEclipse は必要だなあ EclipseのC++プラグインはチンケ過ぎる
>>353 普通にVCとかKDevelop使えばいいじゃないか
>>354 未だにVC++6.0使ってることに苛立ちを感じない?
時代に取り残された感じがすんだよね
マイクロソフトにも見捨てられてるし
なぜ 6.0 ?
未だにVC++6.0使ってる
>>355 に苛立ちを感じる
>>357 未だにVC++4を使ってる漏れには、何を感じます?
SA・TSU・I ?
VCとか、Eclipse+Javaに比べると全然ダメじゃん。 相手にすらなってない。ましてやKDevelopは論外。
そもそも比較するもんじゃないしw
いや、比較するもんだろ。
そんなあなたにVC#2005。
確かに、VisualStudioはC#に関しては、まずまずいい環境。 だが、C++に関しても、そういうIDEが出て来ないとダメだ。 C++にとって、これは大きなマイナス。
#かよ
VC#は、リファクタリング機能があるのはいいけど、編集中にリアルタイムで エラーを表示したりQuick Fixでそのエラー直したりという機能が ないから、まだまだだな。
C/C++は設計思想が古いのでJava並の扱い易さを求めてもだめなんじゃないかと思う。 MSもそこがわかってたのでJavaのコピペのC#を出してきたんだと思うよ。
>>368 言語仕様を扱いやすくするわけじゃなくて、IDEを扱いやすくしてくれと
いうことなんだが。
それとも、C++の言語仕様が邪魔してるのかな。
C++は複雑なケースを考慮すると文法解析が結構大変だし、半自動リファクタリング などとは相性が悪い気がする。その点、C#やJavaは楽だよね。
C++とJAVA両方触ったことのある人しか分からんと思うけど、どう違うの?
またC++、Java、C#の不毛な争いか・・・ 要所要所で使い分ければいいじゃん、くだらね
>>370 確かにそういう気はするな。
だが、JavaのIDEで出来てることが、C#で出来てないってことは
やはりMSの開発がまだ遅れてるという要素も強いんじゃないかな。
オープンソースコミュニティも駄目だし。
>>372 それはそうなんだけど、C++にも〜が欲しいっていう要望だろ。
それは使い分けろじゃ解決にならない。
>>372 画像の自動生成にHSP使ってる俺はだめですかそうですか
こんなとこでグチってもまさに不毛だw
EclipseやNetBeans並みのIDEが出来たらC++にも戻りたいが、 戻れなくなりつつある。 という人は結構いるはず。 C#の人ですらそういう人は多いかもしれん。
>>371 一言で言えばC#やJavaは文法が単純(容易に解析できる)なので自動的に
書き換えたりする機能と馴染みやすいということ。
その分、C++のほうが自由度は高いんだけどね。C++の文法解析の大変さは
STLやboostを使ったときのコンパイルの遅さで実感できるよね。
Javaは10年かかってやっとSTL(Generics)を実装した辺りに、使ってる人の嗜好を感じるよ。
JavaのGenericsは正直、C++のテンプレートとは全然違う。 C++の方がはるかに強力。 だから、確かに静的には、C++の方が強力で自由度が高いのは 確か。 ただし、Javaを学習していくと、見た目とは違ってとても動的な 言語であるということがわかってくるよ。 動的な側面を含めれば一概にC++の自由度が高いとは言えなくなる。
C/C++ + boost + pythonが最強です。
>ただし、Javaを学習していくと、見た目とは違ってとても動的な >言語であるということがわかってくるよ。 そうなの? ぜんぜん気がつかなかったけど、具体的にどう使えばそうなるの? C#の場合はデリゲータが微妙に可能性あるのかなと思ったんだけど、 C#もGenericsはダメだ、無いよりまし程度。 C++はテンプレートと多重継承のおかげでJava, C#とくらべて C++ > 越えられない壁 > C# > Java って、感じかと思ってるけど、あくまで言語能力に限った話だね。 Javaとかと比べるといろんなところにめんどくささがあって、たとえば 便利そうなライブラリがあって使ってみようと思うと、ヘッダーをインクルードして、 staticリンク・DLL、マルチスレッド対応、どれにする? とか、 GCCのlibないぞとかBCでソースからコンパイルしようとすると コンパイルとーらねーとか、ほんとめんどー。 あと、実行環境。C++にもJVMや.Netフレームワークのようなランタイムみたいなのが 欲しい、boostにそういうの期待したいんだけど
言語能力はアセンブラが一番でしょ JavaもC#もC/C++の課題を克服する目的で作られたような所があるからね BoostもLinux派とWindows派に切り裂かれてるような所があるしね
>>384 >そうなの? ぜんぜん気がつかなかったけど、具体的にどう使えばそうなるの?
まず、こういう言語の話をするときの動的とか静的っていう言葉の
意味がわかってるか?
わかってるのならJavaのリフレクションを調べてみろ。
例えば、リフレクションを使えば実行時にメソッド名の文字列で
メソッドを呼び出せたりする。
それを聞いただけでもC++よりはるかに動的であることがわかるだろう。
もちろん、動的ということはそれだけエラーの発見が遅れるという欠点があるが
自由度・柔軟性という点で見ると動的なのはやはり有利だな。
まあそもそもIDEでコンパイル前にたいていのエラーがわかっちゃうから
総合的に見ればJavaの方がエラーの発見は早いんだがねw
極論すると
>>372 になる気がするな。
その生い立ち上、Networkに関しては
Java>>>>>>>>>>C++
だな。
NetworkやXMLとの相性の良さはC++じゃどうしようもない。
時と場合によって、使い分けるのが一番でしょ。 Javaは一般で思われてるほど遅くないけど、やっぱりメモリは馬鹿食いするし、 その点C++は断然有利。 俺も業務ではJavaだけど、家で作るときはDirectX + C++だもんな。
まあ、ゲームはC++だな
予想通りの厨な展開になりつつあるな。w
ていうか、C++用のプロファイラくれ。 フリーか安い物で。
>わかってるのならJavaのリフレクションを調べてみろ。
getMethodとかinvoke ? そういえばそんなのもあったね。
個人的には見た目が(ry というのはおいといて、これって
COMのディスパッチまんまなんだよな。JVMや.NETにはORBが内蔵されてて
こんな感じで使えるようにしてるんだろうな。
つーか、簡単にライブラリを使えるようにするためにはORBが不可欠なんだろう、
C++にはそれが無いからめんどーなんだろうな。
boostってORBあったっけ、boost::python ってどうなってるの? つーことで
>>382 詳しく
(´-`)
>>397 C++の派生スレで出たゴミを本スレに捨てるな
>>394 だから、COMとかそういうんじゃなくて、言語側で出来るところが違うんだよww
そう違うね。よかったね。
例えば、STLの関数ですら文字列で呼び出せるってんなら同等だけど。 COMって言われてもなw
>>401 動的と静的の違いがわからんならすっこんでろ
>>386 >例えば、リフレクションを使えば実行時にメソッド名の文字列で
>メソッドを呼び出せたりする。
因みにない場合はどうなるの?
実行時例外
動的なのがいいってんなら、もっと動的なPythonだかRubyだかやれよJava厨が C++は静的にやるからいいんだよ。
俺は動的野郎じゃ無いけど、Pythonイイね 昔やり掛けたけど、考えてみればBoostでもJavaでもできるだよな ちょっとPython に嵌ってみようかな
C++もJavaや.NETのように、コンパイラやアセンブラ、リンカを テンプレートライブラリとして提供するべきですよね〜
>>405 まったくだ。
-fno-rtti -fno-exceptions なターゲットでもテンプレートばりばり
使えるのが C++ のいいところじゃねーか
そろそろevalでも搭載するんじゃないか?w
INT8
そーいえばCOMのTypeInfoってのがvtblバインディングに対する リフレクションを提供してたなー。 んでVBからでも(バイナリしか無いCOMオブジェクトの)C++の仮想関数を呼べた。 いまにして思えば結構COMって充実していたな・・・
IDEのソース編集中のサポート機能を実装する上で、 #if, #ifdefはウザイ事この上ない。構文解析がかなり難しい。 コンパイルする時と違って、全forkを追わないといけないから。 typedefもぷちウザイ。 とはいえtypedef template欲しいんだけど…
>>412 ああいうのが面倒になったから .NET に走ってるんだよ。w
ってことはCOMはそのための布石だったのかw
COMには困った
THE DAJARE
フォークとナイフは2つで一つ
420 :
デフォルトの名無しさん :2006/05/09(火) 06:18:31
Serializationで保存した型とは違う型で取り出せてしまうのを禁止にすることはできますか? namespace io = boost::iostreams; char buf[100] = {0}; { io::stream<io::array> stream(buf); boost::archive::binary_oarchive oa(stream); oa << std::string("hello"); } { io::stream<io::array> stream(buf); boost::archive::binary_iarchive ia(stream); long l=0; ia >> l; std::cout << l << std::endl; // 5と表示されました }
421 :
420 :2006/05/12(金) 02:04:47
basic_iarchive.cppのload_preambleでクラス情報とかバージョンとか読んでるっぽいのですが クラス情報だけローカル変数に読み込んですぐ捨てられてしまってます. 型があってる,あってないはユーザーが面倒見ろよということなのでしょうか? もしくはほかの所でチェックする,しないを切り替えるスイッチがあるのでしょうか? std::stringやlongとかは実装レベルがprimitive_typeで保存されてしまうようなので薄いラッパーで包んで実験してます struct mystring { std::string str; private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int) { ar & str; } }; struct mylong { long l; private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int) { ar & l; } }; BOOST_CLASS_IMPLEMENTATION(mystring, boost::serialization::object_class_info); BOOST_CLASS_IMPLEMENTATION(mylong, boost::serialization::object_class_info);
422 :
デフォルトの名無しさん :2006/05/12(金) 07:22:33
>>421 漏れもシリアライザは使ってるけど、
型があってるかどうかは自分で面倒見ろってことなんじゃね?
しかしよく考えたら、Boost に限らずシリアライザって
ちゃんと読み込めたかどうかの判定って難しいよな。
偶然矛盾無い値として読めてるだけかもしれないし。
本来なら XML スキーマを用意してバリデーションするべきなのかな?
XMLに出来るし
424 :
デフォルトの名無しさん :2006/05/12(金) 08:02:56
>>423 いや、そういうことを言ってるんじゃなくて、
xml_oarchive ではバリデーションしないよってこと。
>>421 てかload_preambleでクラス情報捨てられてるとか分かってるなら自分で実装できんじゃね?
426 :
420 :2006/05/12(金) 19:06:27
かなりきな臭いながらversionを使うことにより実現することができました struct mystring { static const int id = 1; private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int v) { if(id!=v) throw std::logic_error("aho"); ... } ... }; struct mylong { static const int id = 2; //あとはmystringとおんなじかんじ ... }; BOOST_CLASS_VERSION(mystring, mystring::id) BOOST_CLASS_VERSION(mylong, mylong::id) >> 422 調べてみたのですがC#(.NET Framework クラス ライブラリ)のSerialization...BinaryFormatter.Deserializeメソッドはobject型を返すようになってるみたいです そして戻り値をas演算子などで予想される型にdynamic_castして型があってるかどうか判定したりして使うように思われます >> 423 xml_oarchive, xml_iarchiveで保存, 復元するようにすると確かに望んでるように動作することを確認しました. しかし今回のケースでxmlを使用するのはちょっと贅沢すぎるような気がしました >> 425 さいわい再実装することなく希望する動作をさせることに成功しました. しかしながらほかのboostのライブラリとくらべtemplateによる動作の切り替えの幅がせまく,なにかにつけてマクロを使わせてくるように感じました のでそこらへんをフューチャーする実装を作ってみたいと思います(itukaヽ('ー`)ノ
428 :
デフォルトの名無しさん :2006/05/18(木) 00:43:57
templateなメンバ関数をbindしてfunctionにいれれますか? いったん関数ポインタにしてからいれるのはなんかやです struct A { template<class U> void f(U u) { std::cout << u << std::endl; } }; template<class T,class U> void test(T& t, U u) { using namespace boost; void (T::*fptr)(U) = T::template f<U>; (t.*fptr)(777); // OK function<void ()> fun = bind(T::template f<U>, t, u); // Error on vc7.1 fun(); } int main() { test(A(), 777); return 0; }
>>428 - メンバ関数ポインタの取得に & が必要。
- 非 const 参照の引数として一時オブジェクトは使えない。
これだけ直したら、 gcc 3.4 と VS2005 で通ったよ。
エラーメッセージはなんて出るの?
430 :
428 :2006/05/18(木) 01:19:38
いっぱいでちゃってます main.cpp(23): error C2784: 'boost::_bi::bind_t<boost::_bi::unspecified,F,_bi::list_av_2<A1,A2>::type> boost::bind(F,A1,A2)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。 main.cpp(23): error C2784: 'boost::_bi::bind_t<R,boost::_mfi::cmf1<R,T,B1>,_bi::list_av_2<A1,A2>::type> boost::bind(R (__thiscall T::* )(B1) const,A1,A2)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。 main.cpp(23): error C2784: 'boost::_bi::bind_t<R,boost::_mfi::mf1<R,T,B1>,_bi::list_av_2<A1,A2>::type> boost::bind(R (__thiscall T::* )(B1),A1,A2)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。 main.cpp(23): error C2784: 'boost::_bi::bind_t<R,F,_bi::list_av_1<A1>::type> boost::bind(boost::type<R>,F,A1)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。 main.cpp(23): error C2784: 'boost::_bi::bind_t<R,F,_bi::list_av_2<A1,A2>::type> boost::bind(F,A1,A2)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。 main.cpp(23): error C2784: 'boost::_bi::bind_t<R,R(__cdecl *)(B1,B2),_bi::list_av_2<A1,A2>::type> boost::bind(R (__cdecl *)(B1,B2),A1,A2)' : 'オーバーロードされた関数タイプ 用のテンプレート引数を 'オーバーロードされた関数タイプ' から減少できませんでした。
432 :
428 :2006/05/18(木) 01:29:13
かわりませんでした あきらめます ありがとうございました。
>>432 仕事でもなけりゃ、これを機に VS2005 Express に乗り換えればいいんじゃね?
>>428 function<void ()> fun = bind(static_cast<void(T::*)(U)>(&T::template f<U>), t, u);
>>432 g++ 3.3.5で通る
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
using namespace std;
struct A
{
template<class U>
void f(U u)
{
std::cout << u << std::endl;
}
};
template<class T,class U> void test(T t, U u)
{
using namespace boost;
void (T::*fptr)(U) = &T::template f<U>;
(t.*fptr)(777); // OK
function<void ()> fun = bind(&T::template f<U>, t, u); // Error on vc7.1
fun();
}
int main()
{
test(A(), 777); return 0;
}
436 :
デフォルトの名無しさん :2006/05/19(金) 01:14:57
>>431 コンパイルが通らないと疲労困憊するだろ
つーかVC++は最新でもtemplate廻りは規格適合してないし…
threadもう少し強力にならないかな...
協力すれっど
441 :
440 :2006/05/20(土) 04:03:21
ごめんなさい、速攻で解決してしまいました。 thread/src/one.cppの121行目の部分を return ice_wrapper(&InterlockedCompareExchange, dest, exch, cmp); から return InterlockedCompareExchange(dest, exch, cmp); にダイレクトに呼び出したらうまくいきました。 #defineマクロの所為らしい。 お騒がせしました。
intrusive_ptrでCOMオブジェクトを作成するときとかに余分な手間発生しない? class HogeContainer { intrusive_ptr<IHoge> m_hoge; public: void Create() { IHoge* tmp; foo->CreateHoge( &tmp ); m_hoge = tmp; tmp->Release(); } }; トータルではRelease系の関数無くなってて便利なのは分かるんだが。 なんか上手い方法ないかなあ
>>442 どこが不満なのかはっきりわからんが、
生成するときのエラーはチェックしろよ。
IHoge* tmp;
if(CreateHoge(&tmp))
{
m_hoge = instrusive_ptr<IHoge>(tmp, false);
}
else
{
throw ...;
}
つうか、普通ComPtr使うべ。 instrusive_ptr使う利点って何?
すみません。 正直言うとこういうの手を出したの初めてなのであんまりよく知らないんで… なんか色々とあるんですね
boost::bindについて質問です。 class A { public: std::string foo() { return std::string("aaa"); } }; int main() { A *a = new A(); std::string s = boost::bind(&A::foo ,a)(); std::cout << s.c_str() << std::endl; } 上記コードは正しく aaa を吐き出しますが main()内の2行目を const char* q = boost::bind(&std::string::c_str, boost::bind(&A::foo ,a))(); にするとうまく動きません。( boost::bind(&A::foo, a)() としても同様 ) どなたかご教授頂ければ幸いです。
>>446 class A {
public: std::string foo() { return std::string("aaa"); }
};
int main() {
A *a = new A();
const char* q = boost::bind(&std::string::c_str, boost::bind(&A::foo ,a))();
std::cout << q << std::endl;
}
で動くけど(環境はg++ 3.3.5)
エラーメッセージはどんな感じなの?
たぶん膨大なんだろうけど...
>>446 #include <boost/bind/protect.hpp>
const char* q = boost::bind(&std::string::c_str, boost::protect(boost::bind(&A::foo ,a))())();
でだめなら諦める。
>>447 >>448 レスありがとうございます。
特に
>>447 さん 説明不足でした。
「うまく動かない」というのは aaa を出力せずに 何も出力されない事を言います。
エラーメッセージは出ていません。コンパイラはVC++.net 2002(VC7.0)のものです。
そして
>>448 さんのコードでも出力されませんでした…
boost::protectは見たこともなかったので、もう少し調べてみます。
> const char* q = boost::bind(&std::string::c_str, boost::bind(&A::foo ,a))(); この文が終わった時点でfooの戻り値である一時オブジェクトの寿命も終わっただけではないのか?
451 :
447 :2006/05/21(日) 13:29:59
>>449 >「うまく動かない」というのは aaa を出力せずに 何も出力されない事を言います。
こちらの環境では447でaaaが出る
参考までに
>>450 環境にもよるだろうけどこの程度コードなら「たまたまうまくいく」がまかり通るとおもうけど?
>>452 一時オブジェクトの扱いがvcとgccで違えば結果も違ってくる
454 :
447 :2006/05/21(日) 14:22:05
>>452 「まかり通る」をどんな意味で使ってるのか分かんないけど
そんなのに依拠したコードは気色悪いよ
455 :
446 :2006/05/21(日) 14:33:36
様々なレスありがとうございます。
>>450 たぶん、こちらのコンパイラではその説が正しいかと思います。
strcpy(q, boost::bind(&std::string::c_str, boost::bind(&A::foo ,a)())());
と書き換えたら、正しく aaa が出力されました。
そうすると、
>>451 =
>>447 さんの環境で動いたのは、
>>453 さんの仰る通りでしょうか。
これが正しければ寿命の関係から直接 const char* q に入れるのは諦めですね。
const char* q = std::string("aaa").c_str(); std::cout << q << std::endl; と同じ意味だから、要するに鼻から悪魔。
>>455 >そうすると、
>>451 =
>>447 さんの環境で動いたのは、
>>453 さんの仰る通りでしょうか。
453の「一時オブジェクトの扱い」を一時オブジェクトのスコープと解すると,それは間違い
そうではなくて単にqの指し示すアドレスにある残骸がたまたま表示されてるのだろう
以下のコードでg++でも一時オブジェクトは適切なタイミングで壊されていることが確認できる
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/current_function.hpp>
class String: std::string {
typedef std::string Base_;
public:
String (const char *p): Base_ (p) {std::cout << BOOST_CURRENT_FUNCTION << std::endl;}
~String () {std::cout << BOOST_CURRENT_FUNCTION << std::endl;}
const char *c_str () const {return Base_::c_str ();}
};
struct A {
String foo() { return String("aaa"); }
};
int main() {
A *a = new A();
const char* q = boost::bind(&String::c_str, boost::bind(&A::foo ,a))();
std::cout << q << std::endl;
}
>>453 そうだよね、環境が違えば扱いは変わるよね
同じ日本語でも
男が「愛してるよ」というのは一時オブジェクトだが、
女はそれをstaticなオブジェクトだと勘違いする
そこら辺がトラブルの元だな
static constじゃないと駄目でないか
virtualな女以外もう認められない
「愛してるよ」Object のlifetimeはsex終了までなんですね、男の場合は
>>461 Commandパターン使えばいいのかな?
女性は典型的なsingleton症候群だと言いたいのですか?
Factryメソッドで実装すれば交際相手が簡単に交換できるよ
マルチスレッドとかメンドクサイよね。
そこで
>>438 なわけだが。
実際thread周りでどこら辺に不満感じているか聞きたいかも 個人的にはとりあえずpoolが欲しい
この流れでそうくるか。ネタの続きなのか?
468 :
466 :2006/05/21(日) 23:47:10
どっちでもいいよw
マルチスレッドにすれば同時に何人もの異性と交際しても大丈夫だよね
デッドロック発生して全部パーになるかもしれないから気をつけな
Exceptionのハンドリングを怠るとスレッドがアポーンしちゃうんだよね、怖い怖い
スレッドプールってつまりとっかえひっかえってことか
キープってやつじゃないか?
>>471 フツー、スレッド単体じゃなくてプロセスごと死なない?
リソースリークしまくりなんだろうなあ
476 :
デフォルトの名無しさん :2006/05/27(土) 13:03:10
ところで、TMPってどうよ?
スタートレック The Motion Pictureのことか?
Borland C++(無料版)でBoost.Rangeが使えないというのは意外だった。 MPLのヘッダをインクルードしているのでだめだった。
このスレでは相手にされてないです。> Borland
もう信頼を失ったからね
時々でいいから Metrowerks のことも思い出してあげてください。
Borlandといえばもう何年も前に次のC++ Builderではtemplateのexportもサポートするぜ!とかほざいてた気がするんだが。
export廃止でいいよ!
exportって処理系作る人のこと何も考えてないよな
>>485 CodeWarriorだしたとこならMetrowerksで正しいと思うが
488 :
485 :2006/05/29(月) 23:19:58
>>487 スマン、俺の勘違いだった
Metroworksと覚えてた
ここは、得意の英語で誤るよ
I'm sorry for that.
>>488 > ここは、得意の英語で誤るよ
日本語は得意でないようですね
490 :
488 :2006/05/30(火) 21:27:17
>>489 ホントだ
謝るが誤るだ
情けねえ....
昨日突っ込もうとしたが、誤った英語(拙いという意味で)を使うという ハイブローなギャグかと深読みし、思いとどまってしまった俺。
492 :
481 :2006/05/30(火) 22:06:10
つーか、謝るんなら
>>487 じゃなくて、俺に謝れ。
つーかMetrowerksもうねえよ
freescaleに変われたんだっけ? CodeWarriorは? まだconfig/compiler/metrowerks.hppしかないけど、 CodeWarriorは9ってのは出ているの?
工事中みたいなアイコンがもう見れないのかな
じゃあ、みんなでお葬式をしてやろうぜ
BOOST_PP_ENUM_TRAILING_BINARY_PARAMS ってどういう経緯でこのネーミングなの?単語見ても動作が分かりにくいんだけど
さぁ
>>498 何が分かりにくいかわからんのだが…
プリプロセッサで継続する二項パラメータを列挙する だろ
>>500 ぱっと見て動作が分かりますか?調べないと無理じゃない?
>>501 名前見て動作を理解できるものなどほぼ無い
>>501 ぱっと見て動作が分かるネーミング例を出してみろよ
abort
CreateWindow
違う BOOST_PP_ENUM_TRAILING_BINARY_PARAMS に代わるネーミング例だ
BOOST_プリプロセッサで継続する二項パラメータを列挙する
殺意を覚える回答だな
さほどおかしなネーミングとも思えないけどなぁ
>>503 が正論だな。
そもそも処理が複雑なんだから、
一度覚えて、後から思い出せればいい。
read_write_mutexってデッドロック問題で削除されたみたいだけど もう復活しないの?
Boost.StringAlgoって標準入りの予定はあるの?
513 :
デフォルトの名無しさん :2006/06/17(土) 14:30:32
boostのRTTIに対するスタンスってどんなんでしたっけ? spirit & phoenix & functionで組んだらRTTIのせいか オブジェクトがやたらでかくなった(g++ -O2 / -g無し)。 shared_ptr.hppですらtypeid使ってるみたいで、-fno-rttiだと コンパイルすらできないのは痛い。
515 :
513 :2006/06/17(土) 18:26:23
1.33.1では無いみたいです。 そもそもg++はRTTIの有り無しのオブジェクトを混ぜてリンクできるくせに (RTTI無しのオブジェクト内で生成したオブジェクトをRTTI有りの オブジェクト内で受け取ってtypeidが呼べる。結果は0xへの参照が帰ってく るみたい)ファイル内にtypeidが混ざっているだけでコンパイル出来ないっ てのは激しく片手落ちな感じがする。 templateの使用時の事を考えるとtypeinfoの有無はクラス毎に指定したい。 C++0xで入れてくんないかな。っていうか今すぐほすぅい。
つか、もはやRTTI無しではC++とは言えないから対応しないんじゃないか?
517 :
513 :2006/06/17(土) 18:47:31
どっちかつうと私もそういう考えなんだけど、 explassion template(spirit/bind)的な使いかたすると型名が 凶悪に長くなる。もはやコンパイラの実装の問題では済まない レベルだと思う(バイナリサイズが3倍近くになる)
>>517 そういう目的で作られるクラスには virtual な関数が無いだろうから、
RTTI は生成されないんじゃないの?
なんでやねん
virtula な関数が無ければ、実際に typeid を適用するまで RTTI が必要にならないから。 実際に typeid 使ってるなら変わらないけど。
>>519 virtualな関数が無いクラスに対するtypeidは単なる定数式に展開される。
もちろんオブジェクトごとにtypeidが付くこともない。
522 :
513 :2006/06/18(日) 00:17:25
>>518 >そういう目的で作られるクラスにはvirtualは無い
そうでも無い気がするけど。
少なくともspiritで言えば "aaa>>(bbb|ccc)"みたいに
生成したクラスはrule<>のような型に入れるしかなくて、
その結果、仮想関数使って実際の型に飛ばすしかない。
ただ、それって単なる実装でしか無い気がするし。
組み込みのこととか考えると、virtualを持っているだけで
型情報を組み込んじゃうってのはあまりに安直なような気がする。
つか、virtual関数を持ったクラスならvtabがあるので、RTTIを入れてもインスタンス 単位のオーバーヘッドにはならない(賢い実装ならば)んだけど。
>>522 function なんかは RTTI によるコードの膨張を嫌って
仮想関数を使わない実装になってる。
spirit もそこらへん改良できるかもね。
>>521 それは「RTTIが生成されない」ってことじゃないでしょう?
実装上の工夫が行われているだけ。
>>525 virtual関数を持たないclassのインスタンスは余分なものを持っちゃいけないと
C++の仕様で定義されていたと記憶している。
virtualなものが無いのにインタンスごとにRTTIを持つなんてアホな実装が存在
するなら教えて欲しい。
527 :
デフォルトの名無しさん :2006/06/20(火) 18:31:40
コンパイル時に過多に関するあらゆる解決が終了している ようにかけるところが C++ のいいところだと思うんだが、 もはや RTTI 必須なのか。
>>527 virtualが必要なのと同じ理由でしょ。virtualを全く使わなければ
>>526 の言うように
RTTIの存在自体はオーバーヘッドにならないはずだし。
>>527 その通りなんだけど、RTTIを使えるように も 書けるところがC++のいいろことだ。
>>529 うん、そりゃ同意。
ただ、Boost みたいなかなり重要なライブラリでは
できれば RTTI を使わずに実現できる部分は
そうしてほしかったな、と。
>>530 それは正論だから、ほんとでやる気と時間があるなら
>>514 のやつを
進めてサブミットしてほしい。
let's boostが403なのは俺だけ?
>532 俺もだが数時間前は普通にアクセスできた。 つか、www.kmonos.net自体403になってるな。
長い間更新が止まってるから もうやめるのかな
Boost.Lambdaで条件演算子の代替構文ってないのかな?たとえば bool a = true, b = false; cout << (_1 ? 5 : 3)(a) << endl; // 5が出力される cout << (_1 ? 5 : 3)(b) << endl; // 3が出力される ?:はオーバーロードできないからこのコードはコンパイル通らないんだけど、 (_1 ? 5 : 3)に相当するファンクタを別のラムダ式で書き表せないかな? (3 + _1 * (5 - 3))みたいなのはナシで…。
bool a = true, b = false; (if_(_1)[cout << constant(5)].else_[cout << constant(3)])(a); // 5を出力 (if_(_1)[cout << constant(5)].else_[cout << constant(3)])(b); // 3を出力 ・・・はさすがにあんまりか。
今Let's Boostに行ったら何事も無く表示されたぞ。
Boost.Python があるってことは、 C++ プログラムまわりの標準的な glue 言語として Python がおすすめってこと? それとも他の言語バインディングもこれから続々登場?
>>539 たんにpythonがboost開発者たちにとって主流だからでは。
>>540 単にそれだけか。
Visual Studio に IronPython も入ってきたら、
今までは使われていなかったところにも Python が普及していきそう。
Luaとかどう? luabindつうluaとC++つなぐライブラリあるんだけど boost使いまくってる。いずれBoost.Phythonみたく なろうって魂胆なんじゃなかろうか。
544 :
543 :2006/06/27(火) 22:41:23
って何気なく書き込んだ後542のリンク先をのぞいたら luabindと劇似だ。luabindの作者がかかわってるジャン
>>539 pythonがほかの言語と比べてその方面に力を入れているから。
547 :
536 :2006/06/28(水) 00:01:50
>>542 ありがとう。これでできました。
if.hppが必要なことに気付くのに10分くらいかかったけど(汗
#include <boost/lambda/if.hpp>
bool a = true, b = false;
cout << (if_then_else_return(_1, 5, 3))(a) << endl; // 5が出力される
cout << (if_then_else_return(_1, 5, 3))(b) << endl; // 3が出力される
しかしBoostの中でもBoost.Pythonは浮いてる感じだよなぁ。
Pythonの世界支配の戦略の一環なんだよ Pythonは選ばれた言語らしい
linuxのパッケージの中みても.pyなファイルって結構あるしねぇ
まあ、インストーラからpyだったりするしな
Boost の言語バインディングは今のところ Python と Lua だけみたいだけど、言語依存部分と言語バインディング 全般に必要な部分との切り分けがきちんとされればいいね。 いや、俺にはそんな議論に参加する能力ないんだけど。
>>543 それは, luabind は元々「Boost.Python に触発されて」っていう開発動機があったはずなので,
(将来的に変わるかも知れませんが)方向性が Boost.Python ぽくなるのは必然かと.
>>553 luabind は Boost に入ってないですよ.
>>554 Boost.Python あるいは luabind などが,先行の SWIG
(あと,例えば Python 限定なら SIP とか)などと完全に一線を画している部分として,
後者が独立した IDL を使用するのに対して,前者は TMP などを駆使して
純粋な C++ による DSEL で IDL を提供する方向性を確固たるものにしていて,
(各々の方向性の得失は置いておくとして)
そういう部分ではかなり方向性が違うんですよね.
>>549 でも、実際に使ってみるとコンパイルに掛かる時間で「やっぱりBoost一族だな」と思うよw
>>556 コンパイルしてると困憊るってか
おまい、今時pentiumとか使ってるんじゃないのか?
558 :
543 :2006/06/28(水) 23:59:20
>>555 その様ですね。Pythonはいじったこと無く必然的に
Boost.Pythonもノーマークだったので気付かなんだ。
luabind使ってて思うのはあまりにゴージャス過ぎるって
事。方向性として、極力Wrapperを書かずに既存のクラス
等をLuaに公開しようとしているためか暗黙の変換が多そう
で怖い。lambda/bind等で転送関数を書けるようにする、
程度の方が安心なんだけどねぇ。まぁ、便利なんだけど。
>>557 いや、icc -ipoするとXeonでも合間に珈琲買って来れる。
A Domain-Specific Embedded Language (DSEL) is a library that provides a miniature language-within-a-language for solving problems in a particular domain. Boost の DSEL って early-bound (compile time) なのか late-bound (runtime) なのかどっちなんだろうね。 って、ソースも読まずにカキコ。
Domain-Specific ってどういう意味?
3Dツールのプラグイン言語とかゲームのスクリプト言語とか 対象(取り扱う問題の)領域が限定されてる内部言語のこと。
「汎用」の対語みたいな使い方。
Generic の反対みたいなことか。 あ、でもプログラミングの世界でジェネリックって言うと また別の意味に取られちゃうなぁ。
汎用だとGeneral Purposeとかじゃね?
General Protection Fault!
専用でいいじゃない
Special?
DSLとDSELってどう違うの? なにをどうEmbeddedするのさ
用語なんて気分の問題だよ
もともとの DSL は単体で動く処理系のこと。 DSEL は、親言語に埋め込まれて動作する。独立性は薄いとか親言語の制約を 受けるとかがあるが、親言語で書いたことをそのまま渡しやすい。 でもまぁ今は DSL というと後者だな。
うちはADSLだ・・・
俺はDSBLのお世話になてる
>>564 Generic医薬品のGenericでしょ
>>568 スペシャルって言い方には、Hな雰囲気が漂ってます、どして?
マッサージとか
- お客さん、スペシャルしますか? う〜ん、どうしよ - 気持ちイイよ じゃあ、お願い こんな感じだろうか....スペシャル、お願いします
夜更けにアジア系外国人と思わしき女性が マッサージのポン引きをやっている(多分違法) のをみてスルーしようとしたんだが 「 き も ち い い よ 」
プログラミングで疲れた頭と心を癒すのは、スペシャルなんですねえ
fusion が accept されたり、WG 論文リスト更新されたりしてるけど、 ここも C++0x スレもいまいち盛り上がらんね。 まあ俺は毎日楽しんでるけどな
C++で開発ってのは、今や限られてるしね Firefoxの拡張作ろうと思ったけど、 互換性の問題からtemplateやexception使うの推奨されてない。 Boost使いたいけどあきらめるしかないかな。
>>580 付いていくのに必死すぎて、ここで話題にする気にはなれんw
tuple使ったときのargument is not used. 警告テラウザス
コンパイラの設定で切ればいいだけやん
ちょっと聞きたいんですけど、boostのrandomって MT法使うとして、毎回範囲を変えるのは無理です? まぁ、大きな数字を指定しておいて、 毎回 rand() % max ってやればいいんですけど…
そう言えば、MAXがnew アルバム出したらしいね、評判はどうなんだろ
shared_ptrとmove_ptrの違いが分かりません><
>585 前テキトーにサイコロプログラム書いた時は [0, 1)の範囲で(一様実数分布で)乱数出して、n面体サイコロ振りたいときはfloor(rand_gen() * n) + 1とやってた (rand_genはvaliate_generator型) nによっては分布に影響があるかもしれんが検証してない
variate_generatorだった
>>585 uniform_int<>(0, max)(rand)
じゃダメ?
便乗。 [0.0,1.0) じゃなくて [0.0,1.0] の場合は、 uniform_int から作るしかないかな?
>>591 実数で、0.0と1.0の両方が必要なのってどんな場合?
(0.0, 1.0]なら解るんだけど。
あと、uniform_intからどうやって作るの?
まあ離散的な分布なら作れるだろうけど。
連続一様分布で (0.0, 1.0),(.0.0, 1.0],[0.0, 1.0),[0.0, 1.0] の 差異を気にする必要があるのってどんな場合なんですか? boost::uniform_01 の実装だと,仮数のビットが完全にランダムに 生成されるので,例えば IEEE754 倍精度少数だと 2^52 もしくは 2^51 に 1回のイベントの生起を気にしていることになりますけれど,そのレベルの 一様性を気にするアプリケーションって超大規模シミュレーションぐらいしか ないように思えるんですけれど.
>>594 逆に言えば、そのような超大規模シュミレーションにも
使えるような汎用性をBoostは持っているということではないか。
>>594 0.0や1.0が定義域に含まれない場合に、困るでしょ。
乱数の質の問題じゃなくて、計算の健全性の問題になってくるので。
その逆のケースの話をしてるんじゃないのか?
598 :
591 :2006/07/05(水) 23:51:33
591 だけど、とりあえず実用上問題ないってのは十分承知してるんで、
そこんとこはおいておいてくれ。
>>592 例えば、ゲーム作りとかで「半径xm以内にランダムでばらまく」みたいな仕様が
書かれてたら、まず普通に [0, x] と考えるじゃない。
Cの時代はそもそも rand() が [0, RAND_MAX] だったから、
RAND_MAX で割ればそのまま [0, 1] になったけど、
そういうソースをそのまま uniform_01 * x に置き換えただけじゃ
厳密には同じじゃないよね、って話。
まあ実用上は(ry だけど、596 の言う計算の健全性の問題っつうか。
>594
uniform_01 の精度って渡される乱数生成器の min と max に依存してない?
RNG::result_type が integer で、min〜max が狭いと、差が出てくるような
気がするんだけど、ちゃんと見てないんで違ってたらスマソ。
まあ普通はメルセンヌツイスタとか使うし実用上は(ry なわけだけども。
599 :
594 :2006/07/06(木) 02:36:14
>>596 あ,そういう話ならもちろんそのとおりですね.
594 では, [0.0, 1.0] な一様乱数を片側もしくは両側が開な一様乱数で生成しても
実用上ほとんどのアプリで問題ないという話しかしてませんでした.すいません.
>>598 あ〜,実装は確かにベースとなる UniformRandomNumberGenerator が生成する
乱数の precision がそのまま uniform_01 の precision になりますね,これ.
ドキュメントでこれは buggy だと言ってるので問題として意識されては
いるようですけれど,書いてあるように効率的な実装は難しそうですね.
>>585 valiate_generator::distribution() に新しい範囲で初期化した
distribution インスタンスを代入すればいい。
>>587 ?
auto_ptr と move_ptr の違いってならともかく、
所有権の移動と共有じゃ全然違うじゃん
メルセンヌツイスタって初めて聞いたからググってみたら ウィキペディアにこんなこと書かれてた >高品質の乱数 乱れているのに高品質ってワロタ
これは高度な釣りですね
乱れ方が上品なんだよ。
本気か演技か、ってことか。
知的な美人局じゃねえのか?
昼間は淑女=MT
それはもう、身をよじらせ(twist)ます。
釣りのつもりなんて全くなかったんだけど この流れを読んでたら昔の彼女を思い出しました…書くんじゃなかったorz 今は他の男でtwistしてんだろうなぁ.....orz
ツイスターゲームとか思い出してしまったではないか。 しかしリアルでやることあんのかあれ。
Boost使いには、人生の暗い影が....
彼女って想像上の生き物でしょ?ネッシーとかの仲間。 30年生きてるけど、そんな生き物は見たことないし。
ウィザードktkr
彼方にいる女だから彼女って言うんですよ
加持さん乙
人生の質 一般人>>>>>>>>>Boost使い
>>613 あと10年でワシのような大魔法使いになれるぞえ orz
導師! MPLの実装を読み解くには何年かかりますか?
2 年ぐらいかな? 色々勉強になったよ。
std::vector<int> v; void func(const int n){} std::for_each(v.begin(), v.end(), func); というのがありまして、この std::for_each(〜〜) 自体を boost::function0<void> に突っ込もうとし、boost::bindで bind(for_each, bind(vector<int>::begin, &v), bind(vector<int>::end, &v), func); こんなのを書いているのですが、テンプレート引数を付けたり弄ったりしても なかなかコンパイルが通りません。 何方かご教授お願いいたします。
std::vector<int> v; boost::function0<void> f( boost::bind(&std::for_each<std::vector<int>::iterator, funcの型>, v.begin(), v.end(), func) );
あ v.begin(), v.end()は boost::bind(&std::vector<int>::begin, &v), boost::bind(&std::vector<int>::end, &v) に置き換えて
std::vector<int>を適切な名前でtypedefして、 Boost.RangeEx使ったらもう少し簡潔に書けると思う。
>>622-623 コードまでも、ありがとうございます。
VC7.0 と gcc 3.4.4 (Cygwin) の両方で
そのまま書いてみたのをコンパイルしたのですが、こちらではコンパイルが通りませんでした(vc7.0とgcc3.4)
エラーがずらーーーーーっと…。そして、
boost::bind(&std::vector<int>::begin, &v);
この部分だけコンパイルしてみてもダメだったので
boost::bind(static_cast<std::vector<int>::iterator (std::vector<int>::*)(void)>(std::vector<int>::begin), &v);
こうすると一応できたのですが
その後boost::bind(std::for_each, 〜〜)に入れようとするところでどうしても躓きます…
>>boost::bind(&std::vector<int>::begin, &v); これがダメな時点で無理な気もするが VS2005でならこれで動いたよ。 vector<int> v; v.push_back(0); v.push_back(1); //for_each<vector<int>::iterator, function<void (const int)> >(v.begin(), v.end(), func); function< function<void (const int)> (void)> f = bind(for_each<vector<int>::iterator, function<void (const int)> > ,bind(&vector<int>::begin, &v) ,bind(&vector<int>::end, &v) ,func); f();
このほうが正確かな vector<int> v; v.push_back(0); v.push_back(1); typedef void (*function_pointer)(const int); //for_each<vector<int>::iterator, function_pointer>(v.begin(), v.end(), func); function<function_pointer (void)> f = bind(for_each<vector<int>::iterator, function_pointer> ,bind(&vector<int>::begin, &v) ,bind(&vector<int>::end, &v) ,func); f();
これもVC++ 7.1で動いた。 void myfunc(int n) {std::cout << n << ' ';} int main() { using boost::mpl::identity; using boost::bind; typedef std::vector<int> vec; typedef const vec cvec; typedef identity<void (int)>::type func_type; typedef identity<cvec::const_iterator (cvec::*)() const>::type cbegend_type; typedef identity<func_type* (cvec&, func_type*)>::type rex_for_each_type; boost::function0<void> f; { vec v; v.push_back(0); v.push_back(1); v.push_back(2); f = bind(static_cast<rex_for_each_type*>( boost::for_each<cvec, func_type*>), v, myfunc); boost::fill(v, 10); } f(); std::cout << std::endl; }
>>626-628 ありがとうございます、参考になります。
gcc 3.4.4 (cygwin) と vc++.net 2002(vc 7.0) の両方で試しましたが、ともに動きませんでした。
7.0だと lambda とかも使えないし、いい加減あきらめてVS2003買ったほうがいい気がしてきました。
ちなみに
typedef std::vector<int>::iterator (std::vector<int>::*_t)(void);
boost::function0<void> f = bind(
std::for_each< boost::_bi::result_traits< std::vector<int>::iterator, _t >::type, void (*)(int) >,
boost::bind(static_cast<_t>(&std::vector<int>::begin), &v),
boost::bind(static_cast<_t>(&std::vector<int>::end), &v),
func);
このコードでならgcc 3.4.4(cygwin)で正常にコンパイル&動作が確認できたのですが
vc7.0だと、なぜか未解決の外部シンボル云々…
なぜ今更2003? 2005Expressはタダだし Stdでも3万円くらいだよ。
タダなのは素晴らしいんですが、UI周りが気に入らないのと βの時の使ってみた感じ、くそ重かったんで・・・なかなか手を出そうとは思えないです。
ちなみに、VC7.1のインテリセンスで、 自動パラメータヒントを有効にしたままlambdaを使おうとすると、 自分の環境では、IDEごと固まる。 VC8では、インテリセンスの根性が上がっているのか、そういうことは無いんだけど。
633 :
628 :2006/07/09(日) 19:26:09
>>629 俺のはg++ 3.4.4でコンパイルできた。
ヘッダのインクルードが欠けているとかくだらない間違いではないか?
VC8はテンプレートのサポートが段違いだから Boost使いならVC8推奨だけど。
>>633 gcc 3.4.4 では、こちらでもコンパイルできました。
そして、そのソースをそのままVC7.0上でコンパイルしようとすると失敗するので
インクルードが欠けているというのは無いと思います。
>>634 まじですか、βのときより軽い事を祈ってExpress入れてみようかな…
variantを使ったダブルディスパッチの実現が 驚異的に簡単で感動した。 variantとfunctionがあれば継承なんていらんね。
#include <boost/variant.hpp> using namespace boost; class visitor : public static_visitor<> { public: void operator () (int n, int m) const {} void operator () (char n, char m) const {} void operator () (char n, int m) const {} void operator () (int n, char m) const {} }; ・・・・ variant<int, char> v0; variant<int, char> v1; v0 = int(2); v1 = int(3); apply_visitor(visitor(), v0, v1); v0 = char(2); v1 = char(3); apply_visitor(visitor(), v0, v1); v0 = char(2); v1 = int(3); apply_visitor(visitor(), v0, v1); v0 = int(2); v1 = char(3); apply_visitor(visitor(), v0, v1); 細かくははしょってるが察してくれ。
boost::regex re と boost:sregex re の違いは何ですか?
Boost周辺の事情は全くわかってないんですが BoostはいつからSTLと同じように使えるようになる見込みなんでしょうか
>>641 「STLと同じように」の意味を定義してください
>>642 標準ライブラリとしてという意味ジャマイカ
644 :
641 :2006/07/11(火) 14:17:48
>>643 さんの解釈のとおりです。
コンパイラインスコした時点ですぐに使えるようになるのはいつの日ですかって話です。
それとも、いつまでもアドインのままでいるつもりなんでしょうか。
645 :
639 :2006/07/11(火) 14:51:37
>>640 sはstaticの意味でしたか
ありがとうございました
>>641 TR1, TR2に含まれるものが2009年に標準になる見込みです。
詳しくはC++0xスレへ
2009年なんて10年先じゃんと思ってたら2009年もうすぐになってる
そして俺も独身のまま年をとってゆく・・・
時が加速する
永遠に標準には追いつかない それが++の意味
boost::lambda使ってる人に聞きたいんだけど CPUでコンパイル速度ってどれくらい違いますか? AthlonXPの3000+で式3つくらい書いてたら10秒は平気でかかる。。。 買い替えしたいと思ってしまった
式3つくらいっていわれてもどんな式か書いてくれんとなあ。 if して for して bind するくらいの式3つでは Pen4M 1.4GHz でも5秒しかかからん。
boostって読んだだけで使ったことなかったが boostが愚か者の道具であることが、今のレスでよく分かった
まぁ、思春期ってのはそういう俺発見の連続で出来てるもんさ。
$ cat foo.C #include <boost/lambda/lambda.hpp> using namespace boost::lambda; int main() { int i = 1; int j = 2; (_1 + _2)(i, j); // ok int k = 1; (_1 = 2, _1 + i)(k); } $ time g++ foo.C real 0m0.997s user 0m0.908s sys 0m0.088s Pentium M 1.4GHzですが、こんだけしかかかりません。
656 :
orz :2006/07/18(火) 13:47:54
>>656 これか、唐沢クンの英語はちょっと変だな
それに野晒し状態で今頃彼キレてるんだろうなあ
Can I have a hotfix for this problem?
It is examined VS2003 or VS2005 which to be used for our prodcut.
And this is a big problem to use VS2005.
これってVC8じゃ、shared_ptrは使えないってこと? 何か特殊なケースでのみaccess vaiolationなコードを吐くって事なのかな。
自分が作るライブラリも boost のファイル配置の コンベンションに従うことにした。 すがすがしい気分になった。
面倒くさいから全部同じフォルダに入れてるぜー
おいおい、なんか馬鹿が暴れてるぞ
http://pc8.2ch.net/test/read.cgi/tech/1145115971/ 460 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/19(水) 20:42:18
57 名前:デフォルトの名無しさん[] 投稿日:2006/02/16(木) 10:58:30
>>56 プログラム全体にわたっての型の整合性は
コンパイルが通った時点で保証されている、と信じたいから
という発言に対し、
65 名前:デフォルトの名無しさん[] 投稿日:2006/02/16(木) 21:42:52
っていうか、
>>57 みたいなこと書くやつは死ねばいいと思う。
お前みたいなド素人がプログラミングでメシ食っていこうなんて百年早い
マジ死ねよ
と返す。
これがBoostスレクオリティ。
>>661 うぉ、なつかしっ
そこで引用されている
>>57 書いたの俺だ・・・
そんなところで引用されてたとわ!
>>662 わざとらしいんだよw
どうせお前だろ?
関係無いスレに泣きついて「だれか僕を肯定してー」なんて馬鹿丸出しwwwwwwwwwwwwwwwwww
/**/形式のコメントを正規表現でスペースに変換できますか? 一個のスペースに変換するだけなら regex("/\\*.*?\\*/") を" "に置換するだけでいいんだけれど、 /* hogehoge foofoo */ みたいなのを /* */ に出来なくて困ってる
間違えた みたいに、/とか*とかコメント内の文字をスペース(改行だけはそのまま)に出来なくて困ってます
/* char* hoge = "moge*/";uge*/
boost::serialization では無限大など非数の double を扱う ことは出来ないのでしょうか?たとえば xml_oarchive や text_oarchive に無限大の double を出力すると 1.#INF という文字列で出力されますが、これを再び 読み込もうとすると例外が発生します。 ちなみに非数をストリームに出力したときに実際に出力される 文字列は処理系依存です。
boost の xml_{o|i}archive ではスキーマは明示されていないので 参考程度になりますが、一応 XML Schema では float/double の 表現に 0, -0, INF, -INF, NaN が含められています。 自分は XML にシリアライズした後で XST + CSS で表にする ことがあるので、できればこのあたりは XML Schema に 則ってほしいところですが、xml_{o|i}archive から 派生させたアーカイブクラスを作るべきでしょうか?
Boostの.hppって拡張子は実装も書いてあるヘッダって意味でおk?
c->c, h c++->cpp, hpp
好みの問題だな
ヘッダーファイルって何ですか? by C#使い
帰れ
読み込まれるファイルを毎回コンパイルする無駄を省くために 本来は import されるファイルのエッセンス部分のみを記述した ヘッダファイルのみを読み込む方法が利用されていましたが 結果的にヘッダに関数本体を記述する馬鹿やグローバル変数を 記述する阿呆が大量に発生したため次第に使われなくなりました
俺もその大馬鹿野郎です。いやむかしはちゃんと分けて書いてたよ。 でもJavaとかC#やった後だと、めんどっちーもん。 VCならコンパイル早いし問題なし。 ソースが増えて重くなったら、その都度変更の少ないクラスからcppに移動。
cppにしてもメンバ関数にインラインとかで書くともう ヘッダなのか本体なのかどうでも良くなってくるんだよね
ヘッダに書くインライン関数は型付きマクロだと割り切ってる。
あれだよな。インライン関数とかゴテゴテしたプリプロセッサコーディングとか 個人でやるとキショイとか言われて、メリケンがやるとマンセーするんだよな。 まあ確かに個人レベルでやると他の人が読みにくいが boostくらい浸透してくれるといくらか通用しやすくてありがたいけどな。
>>675 いつの時代の話だ
もう正規表現エンジン全部がヘッダに書かれる時代だよ
テンプレートをプリプロセッサの機能にしなければ ヘッダなんかに書かなくてよかったのになあ。 コンパイルは遅いし、エラーメッセージはわけわからんし。 その点でコンパイラの機能にしているDはよい。
>>682 テンプレートは C++ でもコンパイラの機能だよ。
プリプロセッサの機能は C と C++ で変わってない。
>>682 テンプレートはコンパイラが処理してますが
天麩羅は大好きです
テンプレートをヘッダに書かなければいけない理由は、当時のコンピュータの性能の問題が大きかったと思う。
最近ジーンズのボタンが締まらなくなった
やっぱ、天麩羅の食べ過ぎは良くないよね そろそろみんなも気付いて欲しいね
テンプレートがプリプロセッサなら エラーメッセージ分かり易かっただろうな
682かわいそう・・・ まぁ一度gcc -Eとかしてみよう
C++でのテンプレートは所詮テキストの貼り付けに毛の生えたもん でしかないってのはみんなわかってんだろ? プリコンパイルヘッダなんてもんは規格外だし。 その意味でプリプロセッサっていってんのに。 テンプレートを CPP が処理してないくらい知っとるわ、ボケ。 いっぺん D のテンプレートを使ってみろってんだ。
>>691 独自の用語を使っていると他人とのコミュニケーションが困難になるよ
典型的なD厨だ 怖いよ
>>691 C++のテンプレートは、
コンパイル時の能力がTuring機械と同等です。
Dを仕事で使ってる人って居るのかな?
携帯かなんかでD使ったってのは見たことある
>>697 自分はC/C++、C#、Javaを使うけど、正直C++が一番好き(スリリングだから)
Dの場合はどう? 面白い? メリットは何?
僕は断然 C++ ちゃん! 自分が作ったライブラリがたくさんあるから。 あと、この間、客からGUIカコヨクしろって 無茶言われてパニクったが、C++/CLI で乗り切れたから。
>>691 =
>>682 はまじでかわいそうだな・・・
C++のテンプレートをさわってみて、テンプレートについて何か言ってみたかったんだよね。
まあそんなところだろうな 池沼ほど自己顕示欲が強いわけだし
ワーニングレベルを最高にすると、 Visual C++ でも gcc でも 嵐のようにワーニングが出る。 動いているからいいんだけど、 とりあえずワーニングは無視しとけ、ってスタンス?
うぉーにんぐ
>>704 やっちゃいけない事をやってるからでは。
VCの話だが、/Wallを指定しているのではあるまいな
>>707 そう。boost ビルドするときに /Wall してみたら
えらいメッセージの量でビビタ。
どうしても/Wallと共存したいなら/wdnで消すか#pragma warningを書いた ヘッダを1つ間にかますか。どっちも面倒なのは確か。 >709 確かにリリースビルドだと<vector>とかで出る。あれはさすがになんとかしてほしい
boost::posix_timeを使おうと
ttp://www.kmonos.net/alang/boost/classes/posix_time.html のサンプルをコンパイルしてみると
undefined reference to `boost::gregorian::greg_month::as_short_string() const'
undefined reference to `boost::gregorian::greg_month::as_long_string() const'
undefined reference to `boost::gregorian::greg_month::get_month_map_ptr()'
とエラーがでます。
greg_month.hppを調べてみると確かにgreg_month::as_short_string()は
宣言のみで実装がありませんでした。
コンパイル時に何かコンパイルオプションが必要になるのでしょうか?
環境はvine3.2 gcc3.3.2 boost1.33.1です。
>>711 ライブラリをリンクしないと駄目なんじゃないか?
713 :
711 :2006/08/05(土) 23:32:37
>>712 -lboost_date_time
が必要みたいですね。/usr/libを見てみたらありました。
リファレンスのサンプルに必要なライブラリも書いてくれるといいのですけど。
そういや、 auto_link.hpp でオートリンクされるから 今まで気にしてなかったけど、コンパイラ/リンカに よってはそういうことはできないのか・・・
というか大した手間じゃない。
bjam と vc8 で x64 のライブラリをビルドしたいのですが vcvarsamd64.bat で 環境変数を設定するだけではできないのでしょうか? ビルドした DLL を dumpbin で確かめると x86 のバイナリになっていました。
717 :
デフォルトの名無しさん :2006/08/08(火) 14:38:30
教えてください。 typedef boost::function< void (int,int,int)> myfunc; myfunc ff = boost::bind( &MyClass::test, &m, _1,_2,_3 ); myfunc ff2 = boost::bind( &MyClass::test, &m, _1,_2,_3 ); bool bl = ff.contains( ff2 ); // ここでエラー これをビルドすると、boost::operator ==' : 4 のオーバーロード関数があいまいです、とでるのですが、 何かよき対処法はないですか?
>>717 boost::bindが返す関数オブジェクトにはoperator ==が実装されていないから無理だと思う。
719 :
デフォルトの名無しさん :2006/08/09(水) 10:40:10
boost::progress_timer での経過時間表示のコードを見ると m_os << elapsed() << " s\n" << std::endl; ってなってるんだが、\n と std::endl のせいで 余計な改行があくじゃねぇか。 嫌じゃ。
720 :
デフォルトの名無しさん :2006/08/09(水) 20:50:54
boost::filesystem::symbolic_link_exists ドキュメントでは Windows にはシンボリックリンクないので 常に false 返すよって書いてあるんだけど、せめて リパースタグを見てマウントポイントとかなら true を 返してくれないものだろうか。
721 :
デフォルトの名無しさん :2006/08/09(水) 20:53:26
>>720 そう思うんなら自分でコード書いて dev に投げれば?
723 :
デフォルトの名無しさん :2006/08/09(水) 21:17:10
>>720 Vistaのsymbolic linkならそれでいいとおもうけど、
XPのジャンクションなら、チョト違うからfalseの方がいいと思う。
リパーズポイント使って実装してるんでしょ? リパーズポイントってアドオン系カスタマイズ機構だから。 マウントポイントは、 今ではリパーズポイントの応用として実装されているけど、 シンボリックリンクに近いのは、 マウントポイントじゃなくて、ジャンクションでしょう? って板違いかな? いずれにせよVistaで導入されたsymbolic linkなら、 boost::filesystem::symbolic_link_exists がtrueでいいと思うけど、他はまずいでしょ。
あ、蛇足だけどマウントポイントは論外って事ね。
そんな洒落た機能がWindowsにあるなんて知らなかったよ
729 :
デフォルトの名無しさん :2006/08/10(木) 07:18:49
Linux 由来のコードでちゃんと symbolic_link_exists で ディレクトリ全体の処理がループしないようになってたんだが、 Windows にいしょくして見たらループした。 結局どんなタイプのリパースタグを使っているか個別に判定すると またあとから Windows のバージョンによる移植性の問題が 出る可能性もあるので、 そもそもそういう判定のために 用意されている Windows の NTFS 系の API IsReparseTagNameSurrogate で判定するのがいいとオモタ。 自分用にはもうコード書いて使っているので、 そのうち dev に投げるかもしれないけど、 boost のプラットフォーム依存部分の書き方の流儀? (コンベンション)を理解していないので面倒だなぁ。
Boost.Numeric.Bindingsを使おうとするとsize1やsize2が定義されてないとかエラーがでる。 uBlasを見ると5/18に関数名がsize_mとsize_Mに変わったらしい。 CVSから5/18以前のやつを取ってきたら動いた。 そんなチラシの裏。 boostディレクトリの中にluabindディレクトリができてたんだけど、 そのうちboostと一緒に配布されるようになるのかな?
へー
732 :
717 :2006/08/11(金) 17:25:45
733 :
デフォルトの名無しさん :2006/08/11(金) 22:15:48
vector<A*> vec; //コンテナにオブジェクトのポインタ入れてるときに .. find_if(vec.begin(), vec.end(), ここでうまいことlambdaにオブジェクトを逆参照させる方法ないですかね それともこういうときはポインタを受け取る関数オブジェクトを自分で書くべきですか?
>>733 うまいことやるまでもなく普通にできると思うが。こんな感じで。
# include <vector>
# include <algorithm>
# include <iostream>
# include <boost/lambda/lambda.hpp>
# include <boost/lambda/bind.hpp>
# include <functional>
namespace lam = boost::lambda;
int main()
{
std::vector<int *> v;
v.push_back(new int(4));
v.push_back(new int(5));
v.push_back(new int(-3));
v.push_back(new int(-5));
std::cout << **std::find_if(v.begin(), v.end(), lam::bind(std::less<int>(), *lam::_1, 0)) << '\n';
}
boostに限った話じゃないけど、テンプレを駆使するとかえって可読性を落とす事ってあるよね 特にbind系を使うと 怖いのが慣れちゃうとあまりよみづらいと思わなくなるところ
>>734 さんに提示していただいたintの例だとうまくいったんですけど
以下のコードのような場合は無理ですかね
class A {
public:
int num;
A(int _) : num(_) {}
};
int main()
{
std::vector<A*> v;
v.push_back(new A(4));
v.push_back(new A(5));
v.push_back(new A(-3));
v.push_back(new A(-5));
std::cout << **std::find_if(v.begin(), v.end(), *lam::_1.num > 0) << '\n';
}
hoge.cc: In function `int main()':
hoge.cc:23: error: 'const struct boost::lambda::lambda_functor<boost::lambda::placeholder<1> >' has no member named 'num'
>>736 std::cout << (*std::find_if(v.begin(), v.end(), (boost::lambda::_1->*(&A::num)) > 0))->num << '\n';
>>737 できました。ここまでややこしくなるとlambda使う意義がなくなってしまいますね ^^;
>>734 ,737 どうもありがとうございました。
indirect_iteratorはだめか?
indirect_funもあるぞ
ptr_vectorもあるよ
>>737 昔、template スレにあった、IDispatch の呼び出しを行うラッパを思い出した。
pDisp->*("MethodName")( a1, a2 );
みたいな書き方してあってスゲーと思った記憶がある。
型そのものからメンバ変数を間接参照するとオフセットになるのか なるほど。勉強になった
メンバポインタってやつだな。
746 :
デフォルトの名無しさん :2006/08/15(火) 09:18:24
>>742-745 が全く理解できねぇ・・・
そもそも COM を使ったことがないからかもしれないけど、
"MethodName" って char* だよね?
747 :
デフォルトの名無しさん :2006/08/15(火) 09:19:48
>>746 operator->*は多重定義できる。
漏れも理解できね 引数数は固定になっちゃはないの? なにかミラクルな方法でもあるのかなぁ.....
よくわからんけど、operator->*で関数オブジェクトを返して 引数はboostみたいに0〜n個用を用意するとか。
751 :
デフォルトの名無しさん :2006/08/16(水) 06:33:49
->* っていうひとまとまりのオペレータがあるのか? しらんかった。
.* の事も忘れないで下さい。
753 :
デフォルトの名無しさん :2006/08/16(水) 18:19:30
754 :
デフォルトの名無しさん :2006/08/16(水) 18:36:22
使ったこと無い演算子だ・・・ とりあえずネットでどっかに簡単な説明ない? 多分低レベルな俺には必要ない知識だと思うが、気持ち悪い。 使ったこと無いと言えば、 typeid も使ったこと無いな。
758 :
デフォルトの名無しさん :2006/08/16(水) 20:29:14
Boostと関係ないことですまんが、 上に出てきたみたいな珍しい演算子がたくさんあって、 しかもオーバーロードできて、しかもその前に プリプロセッサで変態プレイができるとなると、 見た目何言語かわからん言語にできちゃうよなぁ・・・ だいたい二項演算子[]が可換って(笑 この変態がっ!!
>>758 3["abcdefg"]とかCでもできる。
761 :
デフォルトの名無しさん :2006/08/17(木) 00:34:53
[]の外と中が入れ替え可能なのは有名っていうかC FAQにも出てくるくらい。
なんで入れ替え可能にしたのかね。
したんじゃなくて勝手にそうなっちゃったんじゃね
array[index]がarray+indexと等価だったりしたんでないの
>>762 x[y] と *(x + y) が等価であることを考えれば当然
「当然」とか言っちゃうんだ
「 x[y] と *(x + y) が等価」という教え方や実装が広まっていたことが先にあって、 標準仕様の策定でもそれに従ったんだろ。わざわざ入れ替え可能にしたわけじゃ ないと思う。なんのメリットも無いだろう。
わざわざ可能にしたわけじゃないだろうが、Cという言語が生まれたときからx[y]というのは *(x+y)の意味だと定義されてた(またはそう実装されていることが広く知られていた)わけだ から、可換であることは自明だし、大昔から有名だよ
>>759 これはいつ見ても戸惑う。
最初に見たのは、やたらと遊び心のあるC言語の参考書だったような。
そもそも"abcdefg"[3]なんてやらないし
>>770 でもさ、16進数表記への変換で
const int i = 11;
const char hex = "0123456789ABCDEF"[i];
とかやらね?
やらね?あ、そ。
ログ出力なんかで使うなぁ。 enum foo {FooNone, FooArc,, FooBox, FooChar}; なんてのがあるとして、 void outLog(enum foo bar, const char * mess) { fprintf(outFp, "%20s %c %s\n", timeStump(now()), "NABC"[bar], mess); } みたいな感じで。 まぁ、勿論範囲チェックは別途行なうわけだが。
>>771 const char hex[] = "0123456789ABCDEF";
hex[i]
でも、C++ではoperator []をメンバとしてしか定義できないので、 std::vectorやランダムアクセスイテレータでは、可換でないのが残念(というべきではない?)
ところで、boost::filesystem::path みたいなかんじで IRI と URI を操作するために広く使えるクラスはないですか? おながいします。
777 :
デフォルトの名無しさん :2006/08/19(土) 05:24:17
778 :
デフォルトの名無しさん :2006/08/19(土) 05:28:50
>>777 ライセンス以外関係なさそう。
APR の C++ 版ってところか。
ライセンスが boost と同じなら、いろいろ使えるかも知れんな。
60.56.176.247 37564 朝練
781 :
780 :2006/08/19(土) 06:14:19
某ネット対戦のゲームスレに激しく誤爆 見なかったことに
782 :
デフォルトの名無しさん :2006/08/19(土) 06:27:10
>>779 俺が作ってた(もしくは作りかけてた)
ネット周りのライブラリとかぶりまくり。
先知ってたら無駄な開発しなくて済んだのに。
まぁ趣味プログラムだからいいや・・・
>>777 SOAっぽいことやろうと思うと、JavaかC#しか選択肢が無かったけど、このライブラリィがあれば
C++でも勝負できるね。
784 :
デフォルトの名無しさん :2006/08/19(土) 22:42:03
>>783 このライブラリも多機能だけど、あとは
Apache Portable Runtime もそうだよな。
同じような機能があるとどれを使えばいいか迷う。
XML周りとか。でもベースになってるのは expat だね。
APRってあれか。ACEがあるのにACEがC++だというそれだけの理由で車輪の再発明した奴か。
>>785 そういう事情なら poco の立場はもっと酷いことになるな。
787 :
デフォルトの名無しさん :2006/08/19(土) 23:57:29
かぶってるというか、比較対象にはならん気もするが・・・
>>743 亀だけど、確かこんな感じだったような…。当時の本人がいたら補完してホスィ。
struct DispInvoker {
IDispatch * p;
DISPID id;
DispInvoker( IDispatch * p, DISPID id ) : p(p), id(id) {}
CComVariant operator()() {
CComVariant retval;
...
pDisp->Invoke( ..., &retval, ... );
return retval;
}
CComVariant operator()( CComVariant a1 ) {
CComVariant retval;
VARIANT args[1] = { a1 };
pDisp->Invoke( ..., &retval, ... );
return retval;
}
};
struct Dispatch {
IDispatch * p;
DispInvoker operator->*( OLECHAR FAR * nm ) const {
DISPID id;
HRESULT hr = p->GetIDsOfNames(IID_NULL,&nm,1,LOCALE_SYSTEM_DEFAULT,&id);
if( FAILED(hr) ) throw CAtlException(hr);
return DispInvoker( p, id );
}
};
// CComVariant name = (pDisp->*L"get_Name")();
// CComVariant result = (pDisp->*L"doSomething")(L"param");
790 :
789 :2006/08/21(月) 14:19:23
あぁ、何か微妙に間違ってる箇所が多いな。 当時、テンプレート総合スレの2でコレをみたとき、C++ スッゲと感動した記憶がある。
>>789 オモスレー
スクリプト言語側の評価機とのインターフェースにも使えそうだ。
アリガトン
>>791 つか、OLEオートメーション自体スクリプト言語用のインターフェースだしな。
793 :
デフォルトの名無しさん :2006/08/25(金) 19:16:06
C# とかにある、いわゆるプロパティのような記法を 可能にするためのシンタックスシュガーを追加する ライブラリ(?)ってないですかねぇ。
794 :
793 :2006/08/25(金) 19:35:30
VCならdeclspecを使えば出来るよ。
プロパティ自体もうアンチパターンだからな
boost/test/utils/class_properties.hpp
codeproject.comのコードは実験的なものが多いから、 boostにあるならそっちを使った方がよいと思うよ。
799 :
793 :2006/08/26(土) 08:19:49
>>797 なんでそれって boost/test/utils/ にあるんだろうね。
boost のって普通のコードで使うためのものじゃないのかも。
ふつうプロパティって言うと setter のコードの中で値の
正しさを検証して問題があれば例外投げたり、
もしくは setter に連動したコールバック関数を
定義できたりするモノだと思うんだけど、 boost のやつは
単純に読み書きのアクセス制限のためだけの機能みたいだし。
>>798 たしかに。でも codeproject のコード参考にして
自分のライブラリに取り込んだりしてるよ、結構。
ところで皆さん俺ライブラリに他人のコード参考にして
一部コピペした時って、どのように著作権表示してますか?
俺は「ここからここまでのコードはこのウェブページを参考にしました」
みたいに書いているんだけど、クラスメイトか名前空間とか
競合しないように臨機応変にいじりまくってるし、
そもそもいじってるうちに元のコードの片鱗も無くなってたりするし。
でそんな感じでぐちゃぐちゃになったコードって仕事で使って
いいものかとおもって車輪の再発明してみたり。
俺ライブラリはGPLで出せるんだけど、細かく見ていくと
「あ〜ここの数行はコピペしたんだよな、どっかから」
って感じで、ライセンスがクリアじゃないから出せない。
>クラスメイトか名前空間とか競合しないように臨機応変にいじりまくってるし 級友を弄る>799がいるのはここですか?
弄らないと級友と競合するからな。シンボルを巡って三角関係に。そしてリンカが止めに入って・・・ 著作権表示というか、参考にしたものはコメントに書いておくよ。 ところで仕事に使ったコードを GPL で出しちゃうのか?
802 :
793 :2006/08/26(土) 10:21:42
>>801 俺ライブラリはGPLで出せる。
仕事とは関係なく書きためてきたものだから。
部分的にGPLなソフトウェアに組み込んだこともある。
で、それを使うとさらっと書ける仕事がある。
使うとGPLに感染する。
仕方ないので車輪の再発明をする。
デュアルライセンスという考え方で何とかなるのかも試練が、
そもそもデュアルライセンスという考え方が理解できない。
自分が著作権を持ってるコードなら、ライセンスがなんだろうと 利用が制限されることはないだろ。 GPLの基で公開しておいて、自分はクローズドに使うというのは なんの問題もない。
そういえばNPLではNetscape社は独占的な利用ができたな。 そんな感じでNPLのNetscapeだけ自分に書き換えたOrePLでも作って OrePL/GPLのデュアルライセンスにするとか。
805 :
793 :2006/08/26(土) 11:22:00
>>803 そうなんだよな。最初は。
で、GPLで公開するとパッチや改善のためのコードが
送られてきて、それをマージするともはや自分だけのモノじゃなくなる。
新しいバージョンのコードはクローズドでは使えない。
>>805 GPLはウィルスより悪質だとか言われる所以ですなw
このスレ的には Boost ライセンスじゃないのか
808 :
793 :2006/08/26(土) 16:13:03
>>807 うむ。そうすると、Boost ライセンスで公開すればいいのかな。
あ〜でもただ乗りすんな、っていう心の狭い俺には Boost ライセンスは
おおらかすぎるなぁ。
心が狭いのに公開したいの?w
>>793 はいはい、後は自分の日記にでも書いてね。
お前の糞ライブラリのライセンスなんてどうでもいいから。
>>810 予想を裏切らないな、お前
こういうこという椰子が出てくるなと思っていたところだ
後付の言い訳乙
まぁ何も作れない奴はすぐ妬むから。
俺はむしろプロパティより pimplイディオムを使用した時にグルーコードを いちいち書かなくて済むライブラリもしくはテクが知りたい
>>811 椰子とか使ってんの?
いつの時代の2チャンネラだよ。古っ
>>814 全部仮想関数にして継承する方法もあるよ。
インスタンスは new で作ることになるけどね。
パフォーマンス的にあんまり変わらなくて、ちょっとだけ楽だから、
new に抵抗が無い環境で最初から書くなら pimpl よりこっちがお勧め。
pimplイディオム使ってる時点でnew必須だろ
>>818 あー、そうだった。
じゃ継承する方法のデメリットはほとんど無いね。
やっぱりお勧め。
>>819 何言ってんだ。
pimplイディオム知ってるのか?
>>819 お前自分がpimplイディオムもちゃんと分かってない馬鹿と露呈したんだから
ちょっとは勉強してこいよ。
そんなんじゃこの先、ずっと恥の上塗りの連続だぞ?
ニキビだと思ったんだろ
>>820-821 pimpl と、継承を使う方法は、実装を隠すという同じ目的のための
2つの手法だよ。継承を使うほうには pimpl みたいに名前が付いてないから
マイナーなだけ。
// Foo.hpp
class Foo {
public:
friend Foo* new_Foo();
virtual void f() = 0;
private:
class Impl;
};
Foo* new_Foo();
// Foo.cpp
class Foo::Impl : public Foo
{
// ここに実装用メンバ
public:
void f() { /* ここに関数の実装 */ }
};
Foo* new_Foo() { return new Foo::Impl(); }
825 :
823 :2006/08/26(土) 23:30:56
>>824 ごめん。わかんねーや。何がおかしいの?
>>814 が言うようなグルーコードが無いから
こっちの方法がお勧めできると思ったんだけどね。
>>825 STLのコンテナに入れることが出来ない。
なんだかよくわからんが、そもそも
>>818 は、おかしくないか?
それと、実装の隠蔽については、boostのドキュメントにあったぞ。どこかは忘れたが。
>>823 名前が付いてないって...どうみてもそれclass side factoryじゃん。
有名どころなんだから名前ぐらい知っておこうよ。
>>825 class Fooを派生するときに困る。
>>829 実装を隠す方法の一部に class side factory パターンを使っているだけ。
実装を隠す方法に class side factory と名前が付いているわけじゃない。
>>830 実装継承するつもりが無いんで、あまり問題にならない。
むしろ実装継承を排除できる。
>>832 いや、お前が困るかどうかの話なんかしてないし。
まぁ将来変な制限の為に困らないためにも、実装を隠したい場合はpimplの方がお勧めだね。 グルーコードはコピペでw
836 :
デフォルトの名無しさん :2006/08/27(日) 04:42:15
boost::shared_ptr のインスタンスを XML にシリアライズしようとすると なぜか boost::scoped_ptr<std::locale> のコピーコンストラクタを 呼び出そうとして、そりゃ private だぉ (non-copyableになってる) って怒られるんですが・・・なんででしょうか?
837 :
836 :2006/08/27(日) 10:07:01
ごめん、 template<class Archive> serialize(Archive ar, const unsigned version); って宣言してた・・・・ Archive を参照でうけてなかったんで、コピーが発生してました。 しかしテンプレートがらみでエラーが出ると、原因を追っかけるのが 大変ですね。結局エラーが再現する最小のコードにまで削って、 ようやく気がつきました。 秋の気配を感じる心地よい週末、これでようやく持ち帰りの コードを書き上げられそうです orz
>>837 エラーを特定するのが、えらい大変だっちゅうことだな
誤爆だろw
>>843 アニオタがアニオタと非難するのかw
最高の馬鹿きたw
>>843 オールドタイプってそういう意味だったのか。
勉強になった。ありがとう臭いアニオタ。
職場にいるアニヲタがよく使ってるからな 意味はよく知らんけど
>>844 自分がアニオタだって認めちゃってるしw
ニュートラルと遺伝子操作したデザイナーズじゃねえの?
おまいらはコーディネーターじゃなくてコーダー
Are you high level booster!!!
>>852 ここ何のスレだと思ってるんだ
ガンダムの話に決まってるだろう
Spiral Boost とか Super Aero Boost についてはこのスレで大丈夫ですか?
このまま連合vsザフトの話へ流れるのは避けたい
名前が出たらNGぃ〜
うにゅーうめぇwwwwwwww
正規表現スレと迷ったけどこちらへ。 w2kで boost::regex re("本"); てするとboost::bad_expression例外が発生するんですけど何が原因でしょう。 SJISだから?
wregex
>>853 ガンダムで盛り上がっちゃうことがこのスレの限界かもね
でも、それはそれで息抜きも必要ってことで...
ガンダムネタだけど、
seedのOSを書き換えてるシーンは、
どう見てもパラメータを変えてるだけにしか見えないよお
>>860 よく映画とかの不正アクセスとかのシーン
キーボ連打であと10秒 ヽ(`Д´)ノ とかありえなす
FAT32のパーティションにインスコするんじゃなかったorz
キーボードを早撃ちしてると、仕事が凄く出来ると思われる気がする パフォーマンスに過ぎないんだが...
一項関数を引数に取る関数、例えば微分を行う関数を無名で作ることってできないんでしょうか? const double dx = 0.0000001; boost::function<double (double)> deriv(boost::function<double (double)> func){ return ((bind(func, (_1 + dx)) - bind(func, _1)) / dx); } これを int main(){ const double dx = 0.0000001; boost::function<boost::function<double (double)> (boost::function<double (double)>)> deriv = ... } こんな感じにしたいのですが。
boost::lambda でできるのでは?
lispだと (lambda (g) (lambda (x) (/ (- (g (+ x dx)) (g x) dx))) という風に書けるんですけど、boost::lambdaはλ式の入れ子構造が使えるのかわからないんです。
class Hoge { typedef shared_ptr<Hoge> HogePtr; typedef std::list<HogePtr> Container; このときにfor_each使うときってどうするんですか?
うお、書いてる途中で書き込んでしまった。 class Hoge { void Func(); }; こんな感じです
>>871 mem_fun使ったら怒られてしまったので。
>>872 じゃぁそのソース(と、できればエラーメッセージも)貼ってもらわないとわからん。
情報の小出しになってしまってすいません。 class Hoge { public: void Func(); }; typedef shared_ptr<Hoge> HogePtr; typedef std::list<HogePtr> Container; Container g_container; void CallFunc() { std::for_each( g_container.begin(), g_container.end(), mem_fun(&Hoge::Func) ); } で、エラーメッセージはこうです。 >error C2664: 'void boost::mem_fun_t<S,T>::operator ()(T *) const' : >1 番目の引数を 'boost::shared_ptr<T>' から 'Hoge *' に変換できません。 もちろんですが、std::list<Hoge*>なら上手くいきます。 と、書きながら気づいたのですが、 全メンバに対してmem_funでgetして更にHoge::Funcを呼び出すようにすればいいのかな?
>>874 あー std::mem_fun はスマートポインタへのサポート無いから、駄目だね。
boost::mem_fn で置き換えるとそのままいけるよ。
ほかにも boost::bind でも boost::lamnda::bind でもいける。
>>875 ほんとうだ。mem_fnにしたら行けました。ありがとうございます。
877 :
デフォルトの名無しさん :2006/09/06(水) 08:48:30
boost::ptr_vector って、 シリアライザ用意されてないんだね。
やられた。<boost/cstdint.hpp>には、(u)intptr_tがないなんて。
879 :
877 :2006/09/06(水) 13:07:59
881 :
877 :2006/09/06(水) 13:34:34
ようやく 1.34 で Xpressive くるか!
883 :
デフォルトの名無しさん :2006/09/06(水) 18:52:14
正規表現ライブラリが 何種類も用意されるんだな。
filesystem::path が、filesystem::basic_path になるのは地味に嬉しい。
885 :
デフォルトの名無しさん :2006/09/06(水) 22:13:33
もうC++とBoost無しでは生きていけなくなりそうだ
C++とBoostと結婚したら重婚になってしまいます
C++やBoostに戸籍なんてないから事実婚でOK
891 :
デフォルトの名無しさん :2006/09/06(水) 23:20:14
>>890 そうか、今までunicodeは使えなかったのか。
個人的にはURLも統一的に扱えると便利なんだが。
893 :
デフォルトの名無しさん :2006/09/07(木) 06:33:17
Program Options を使っておられる方に質問です。 たとえばコマンドラインでデバッグレベルを設定するのに、 optionsDescriptionOfCommandLine.add_options() ("debug-level", value<unsigned> (&generalOptions.debug_level)-> default_value(0), "debug level"); のようにすれば、 store(command_line_parser(argc, argv). options(optionsDescriptionOfCommandLine).run(), variablesMap); notify(variablesMap); としてコマンドラインの解析が終了するとともに generalOptions.debug_level に値が格納されます。 とすれば variablesMap からその後改めて generalOptions.debug_level = variablesMap["debug-level"].as<unsigned>() のように値を取り出すことができる意味はあるのでしょうか? variables_map に as メソッドが用意されている理由が分かりません。 また notify メソッドは何のために必要なのでしょうか?
894 :
893 :2006/09/07(木) 10:11:05
パラメータの正当性を自分でチェックするための コードがコールバック(?)されるようにするためのものみたいですね。 あと、さっき気づいたんですが、あらかじめ用意されている 基本型や std::string など以外の型でも、 1)デフォルトコンストラクタが用意されている 2)代入演算子が用意されている 3)std::istream& operator>> が用意されている 4)std::ostream& operator<< が用意されている この条件さえ満たせばオプションの型として使えるみたいですね。
895 :
デフォルトの名無しさん :2006/09/07(木) 10:11:52
basic_path ってことは basic じゃないすごい なにかとてつもないクラスが用意されているんだな!
namespace boost { namespace BOOST_FILESYSTEM_NAMESPACE { template<class String, class Traits> class basic_path; struct path_traits; typedef basic_path< std::string, path_traits > path; struct path_traits { typedef std::string internal_string_type; typedef std::string external_string_type; static external_string_type to_external( const path &, const internal_string_type & src ) { return src; } static internal_string_type to_internal( const external_string_type & src ) { return src; } }; # ifndef BOOST_FILESYSTEM_NARROW_ONLY struct wpath_traits; typedef basic_path< std::wstring, wpath_traits > wpath; うれしいね〜
897 :
デフォルトの名無しさん :2006/09/10(日) 08:02:40
std::auto_ptr って boost::scoped_ptr に代入できるんだな。 std::auto_ptr でさんざんこねくり回してから 最終的な保持場所に boost::scoped_ptr に代入すればいいのか。 こねくり回すときには今まで boost::shaed_ptr を使ってた。
>>897 書き手の日常が臭ってくる卑猥な文章だったんで少し脚色してみた。
チンポ って マンコ に挿入できるんだな。
指 でさんざんこねくり回してから
最終的な保持場所に チンポ を挿入すればいいのか。
こねくり回すときには今まで バイブレータ を使ってた。
妄想癖があることだけは解った
楽しそうだな、おまえら。
>897 は、自分が発してる卑猥さに気付いて無いんだね
>>897 知識披露厨ってやつか。 C++ 相談室にも居なかったか?
独り言はチラシの裏にでも書いとけ。
と思ったけど、このスレをさっさと落とすのには役立つから、ここでなら別にいいや。
>>897 まぁおまえのような奴はどこのスレッドに行っても
うざがれるだけだろうけどな。
俺はBoost厨の集まるゴミスレがさっさと落ちてくれればそれでいい。
死ねよ。
変なのが粘着しちゃったな
まぁ、発見がたくさんある人生は楽しそうで羨ましいかなw<ってことは分かった
もうこのスレは終わりでいいだろ C++のスレをいくつもたてんなよ。
ここはboost馬鹿の隔離スレなので必要。
まだ終わらんよ
Boostは、C++皇位継承権第一位の皇太子だかんな
Boost.Serialization 先にarchive関係のヘッダインクルードしてなかったせいで 奇妙なエラーが出て悩んだ...orz
>>916 うむ、そうだよな。俺も悩んだ。
boost/archive/xml_iarchive.hpp とかを
先にインクルードしておかなきゃ駄目なんだよな。
ホントは順序依存性があるのは良くないことなんだがな。
あるならあるで #error とか使って止めてくれって思うよ。
何をシリアライズしたいか、プログラマ以外には分からない。
>>918 どんな順でヘッダふぃあるをインクルードしようが
テンプレートが特殊化される時点では boost::serialization::*
も boost::archive::* も読み込まれているので、問題ないはず、
まぁそれは理想で現実はインクルード順が違うとエラーになるんだが。
何が困るかって言うと、もし自分が使用したいライブラリの中で
さらにインクルードが行われていると、制御するすべがない
場合もある、ということだな。
とはいえ、今のところサードパーティのライブラリが boost
依存なんて聞いたことがないので、自分でインクルード順に
気をつけていればいいだけなんだが。
boost::serialization::make_nvp は ワイド文字や実体参照には対応してないのでしょうか?
>>920 それは、XML のタグ名としてワイド文字を使いたいと言うことですか?
922 :
920 :2006/09/13(水) 16:28:13
>>921 ワイドで統一してる場合、そこだけchar*になるのも嫌だなと思ったので。
NVPはタグになるから実体参照関係ないですね...
だから、型名を直接埋め込むわけにはいかないのか。
.NETでも
hoge<int,int> -> hogeOfInt32Int32
とかに変換されてるぽいし。
>>922 make_nvp のソースを見てみれば分かると思うけど、
タグ名への変換は単純にプリプロセッサの文字列化演算子を
使っているだけなので、ワイド文字は想定されていないみたい。
ところで、俺は普通直接 make_nvp を呼び出さずに
BOOST_SERIALIZATION_NVP(aiueo) みたいに呼び出して
タグ名は aiueo で値は変数 aiueo なので、
変数名 = 要素名 なんだけど、わざわざ要素名にワイド
文字を使いたいってことあるのかな?
Boost初心者です。 いちいちVisual Studioのディレクトリにインストールするとめんどくさいので、 プロジェクトの中にProjectA/inc/boost/とか作って、その中に使いたいヘッダを どかっと入れようと思うのですが。 boost/config.hとか boost/config/以下のヘッダ群が気になります。あれも入れた方が良いんでしょうか。 あれらって、インストール時に自動的に生成されたヘッダだったりするんでしょうか。 それともどの環境向けのboostでも同じコードなんですか? プロジェクトをいずれ色んなコンパイラでビルドできるようにしたいので、boostで必要な ヘッダを入れて、どの環境のコンパイラでもそのままビルドできるようにできるといいのですが。
>boost/config.hとか
>boost/config/以下のヘッダ群が気になります。あれも入れた方が良いんでしょうか。
たいていの場合他のヘッダが依存しているので入れないと機能しないはずです.
>あれらって、インストール時に自動的に生成されたヘッダだったりするんでしょうか。
多分no.$(BOOST_ROOT)/boost以下は全てパッケージの段階で存在するファイルのはずです.
>それともどの環境向けのboostでも同じコードなんですか?
ヘッダに関してのみなら多分yes.
単に#ifdefで切り分けていたりとかそういうコードで占められているはずです.
>プロジェクトの中にProjectA/inc/boost/とか作って、その中に使いたいヘッダを
>どかっと入れようと思うのですが。
bcpを使って依存しているファイルのみを自動でパッケージから抜き出せるのでご参考までに.
http://www.boost.org/tools/bcp/bcp.html
>いちいちVisual Studioのディレクトリにインストールするとめんどくさいので Boost インストールする場所なんてどこでもいいと思うんだが。 ちなみに俺は各マシンでビルドするのが面倒くさいので、 ビルドしたバイナリをインストーラ付きのパッケージにしている。 で、パッケージのインストール先は C:\Program Files\boost だ。 いや、まぁそんな空白入りのディレクトリに入れるなとか言う批判も わかるが、VC++ ならそんなディレクトリでもインクルードパスに 追加できるし、無問題。 ホントは Windows も UNIX 系のディレクトリコンベンションに 従っててくれればよかったんだけどね。 C:\usr\local\include とかさ
聞いてもいないことをペラペラペラペラと・・・ パスに空白があることより、お前の頭に空白があることが問題だ
>>928 いちいちそんなことで絡むなよ
カルシウム取れ(´ー`)ノ⌒θ
>>926 おお、ありがとうございます。
bcpなんてのがあったんですね。
>>927 そういうやり方もありますか。環境をWinだけに限ればそのやり方もありかもしれませんね。
しかし、config.hとか見てみると#defineで処理分けていますが、あそこらへん、ユーザーがマクロ名の定義とかする必要があるシチュってあるんでしょうか。
>>928 それ、誰かに聞かれたの?
聞かれていないならペラペラと無駄なこと書かないように :-)
>>931 それ、誰かに聞かれたの?
聞かれていないならペラペラと無駄なこと書かないように :-)
恐怖の無限ループキターーーー!
>>933 まぁ実際にはループになってないけどねw
聞かれていないなら言うな、と主張してるのは片方だけだからw
>聞かれていないなら言うな、と主張してる 誰がどのレスで?
ねばるねばるw
外したこと書いたって思った時点で粘着やめて頭冷やしてくれ。 できればURLも暫く忘れて来ない方がいい。
じゃあお前は来ない方がいいね
まぁみんなでカルシウム摂るということで
最近「カルシウム」という単語をよく見る気がする。
カルシウムにはVDも必要だぞ!
bcpってソースコードでしか配布されてみたいですね。 boost/tools/ 以下のツールプログラムの一括コンパイルのやり方がよく分かりません。 bjamを使うらしいことは分かるのですが・・・。
>>943 一括コンパイルはわからんけど、bcpだけならtools/bcp/でbjam実行すれば
bin/boost/tools/bcp/あたりに実行ファイルできるんじゃない?
>>944 アドバイスありがとうございます。でもbjamってmakeと違って良く分からなくて、
どんな引数を与えればよいのか・・・。
>>945 bcpならとりあえず-sTOOLS=(ビルドツール名)だけつけとけばいけるよ
>>946 >>947 ありがとうございます。できました!
最初Cygwinでやってたら失敗して、コマンドプロンプトで成功しました。
しかし、bcp shared_ptr fooとかやってもかなりの量コピーされるなぁ・・・。
shared_ptrのなかにthisを入れてreturnしたりするのってよくない?
950 :
949 :2006/09/19(火) 17:30:07
このようなコードなのですが、shared_ptrを使うと、main()のスコープから外れる前に deleteされてしまって、セグメンテーションフォールトが起きます。 どこがおかしいのでしょうか。 #include <iostream> #include <boost/shared_ptr.hpp> struct A; typedef boost::shared_ptr<A> APTR; //typedef A* APTR; void print(APTR); struct A{ virtual const char *name(){return "A";} virtual APTR getPointer(){return APTR(this);} virtual void p(){print(APTR(this));} virtual ~A(){std::cout << "~A" << std::endl;} }; struct B : public A{ virtual const char *name(){return "B";} virtual ~B(){std::cout << "~B" << std::endl;} }; void print(APTR a){ std::cout << "print: " << a->name() << std::endl; } int main(){ APTR b(new B); print(b->getPointer()); b->p(); }
getPointer()が返る時にはdeleteされてるんで当然だろ
BとDを使え
端的に言うとshared_ptrの使い方根本的に間違ってる。
enable_shared_from_thisかな?
>954 950じゃ無いがそんなのあったんだな 俺はweak_ptr持たせてその都度lock()してたよ
Boost C++ Library プログラミング 購入。 これで俺もBoost馬鹿に。
ドキュメント読もうとしない時点でただの馬鹿
文字化けしてますよ。
文字化けしてませんよ。
960 :
949 :2006/09/20(水) 06:59:06
使い方が間違っているから、先にdeleteされてしまうんだとは思いますが、 shared_ptrの用途は合っていますか? 生ポインタと同じように使って、いろいろなスコープにコピーされるけど、 最後のポインタがなくなるときに、生ポインタも解放される、 という使い方をしたいのですが。 virtualなメンバ関数は継承元ポインタで呼び出したときでも、継承先のメンバ関数が 呼ばれる、という普通のポインタのような継承もしたいのですが。
>>960 用途はそれで合ってると言える。 "shared" だからね。
継承したときの動作も普通のポインタと同じ。
>>960 そういう用途なら、IUnknown みたいな参照カウント管理を行うための
クラスを用意しておいて、intrusive_ptr でラップしたほうがいいような気がする。
>>962 それは効率が問題になってからでいいんじゃないの?
いや、クラス側が自分へのポインタをスマートポインタで返したいって話なら、 侵入型スマートポインタが一番自然な解だと思うが。
>>964 boost::shared_ptr とかの
普通のスマートポインタじゃなくて?
侵入型も普通のスマートポインタだと思うがw
boost::filesystem:wpath が使えるようになるのは、 次のバージョンからでしょうか?
>>967 yes。
ただし、CVSから、最新版落としてくれば今からでも使える
デフォルト引数を使った関数でboost.bindするときは注意が必要なんだな。 あのエラーメッセージじゃデフォルト引数の問題と気づくのは至難の業だ。
>>967 boost::filesystem::path の wchar_t バージョン?
>>970 そのとおり。basic_stringみたいにbasic_pathというクラステンプレートが作られた。
Windows な人が今のバージョンの boost::filesystem:: で ディレクトリ一覧を取得したりして、日本語ファイル名が 含まれていると、今は std::string なのに UTF-8 が 入って返ってきたりするのか。
UTFじゃなくてOS依存でUCS2かUCS4になるはず。 たぶんWin32だとUCS2で入ってくる。
吐き気がした
>>973 Win32 API が MBCS なり UTF-16 なりで返してくるファイル名を(どうやってか)UCS2に
変換して、それを std::string に入れるの?! そりゃ酷い実装だな・・・
普通UCS-2やUCS-4はwstringのはずだよな。
今のboost::filesystemは、APIが返すバイト列をそのまま使ってるだけじゃないのか? FindNextFileAとか直に書かれてるし。
>>973 いや、wstringはUTFを扱えないからUCSで処理するだろう。
<演算子とか使えなくなって大改造が必要になる。
だから変換時にUCSの範囲を超えたら例外を投げるか
あるいはそこでの動作保証をしないかのどちらかだろ。
wchar が UCS2 か UCS4 かってどこかで決められてるの? Windowsでのワイド文字はどっち?
wchar_tが具体的に何bitかはコンパイラの勝手。VC++@Win32だと16bitでgcc@Linuxだと普通32bitだったと思うが。 wchar_tにどのエンコードで入ってるかはライブラリやユーザーの勝手。 OSレベルの話ならWindwos2000あたりまではUCS-2、XP以降でUTF-16になったと思うが、 Windowsのどのバージョンが具体的にUnicodeのどのバージョンをサポートしてるかはしらん。
>>980 そうか、Windows のAPIでUnicode版ってのが UCS2 じゃなくて UTFー16 になったのは
最近のことだったのか。UCS2 の範囲を超えたら例外って意味が分からなかったんだよ。
そうすると boost::filesystem はかなり無茶しているなぁ。
Windows API とのやりとりなんてバイト列そのまま受け渡しだから。
OSの話だけじゃなくてsortとかiteratorの問題もあるから どうしても文字セットを広げたければUCS4でやるべきなんだな。
結局、Visual C++ のコンパイラと付属ライブラリが wchar_t を16ビットで扱うのが悪いということか。 ところで wchar_t って組み込み型?それとも typedef 型?
つーか文字列のiteratorはrandom accessにすべきじゃなかったんだ。 今更言ってもどうしようもないが。
>>983 C++の規格では組み込み型。VC++はコンパイルオプションでどちらにもできたと思う。
>>984 random accessできない文字列のiteratorって何に使うの?
マルチバイト文字列をこの世から消し去りたい
I want to obliterate all the characters not used in the English-speaking world.
>>986 984ではないが、
たとえば検索したり連結したりストリームと読み書きしたりなどといったことはBidirectionalであれば十分。
ランダムアクセスしたければvectorで扱えばよいと俺は思う。
>>989 vector に入れてランダムアクセスできる型が basic_string に入れたら
ランダムアクセスできなくできなくなるのっておかしくね?
>>990 basic_stringクラスそのもののことを言っているんじゃないかと。
そのうち効率重視の sequential_string とかが出てくる夢を見た。 驚いて飛び起きたら、まだ5時だった。
作るのは自由なんだぜ。
次スレどうする? 今の内容で次スレ立てていいか?
ダメ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。