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

Boostを語れゴラァ part5

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

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

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

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

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

boost info
http://shinh.skr.jp/boost/
0496デフォルトの名無しさん2008/02/11(月) 12:21:29
xpressiveなんてのが増えてたのか。
regexとモロかぶってるw

しかし、ライブラリのコンパイル不要なのと
static regexが使える意外で、regexと何か
大きな違いがあるのだろうか?
0497デフォルトの名無しさん2008/02/11(月) 12:26:46
速い(静的な意味で)
0498デフォルトの名無しさん2008/02/11(月) 12:28:02
regexと比べて全体的に速い
リンク不要といっても演算子によってフル展開されるから
総コンパイル時間は長くなる
0499デフォルトの名無しさん2008/02/11(月) 15:41:15
>496
再帰処理が可能なのも大きい。
普通の正規表現では対応できない入れ子表現なんかも処理できる。
0500デフォルトの名無しさん2008/02/11(月) 16:50:37
あの、なんでこのコードでboost::algorithm::findと曖昧と言われるんでしょう?
VC++ 9とかg++ 4.1.1にBoost 1.34.1, range_exは1.0 (?)ですけど。

#include <istream>
#include <string>
#include <boost/algorithm/string/find.hpp>
#include <boost/range_ex/algorithm.hpp>

void f(std::istream& is)
{
  using std::string;
  string s;
  getline(is, s);
  string::iterator it = boost::find(s, ':'); //range_exのやつを呼びたい。
}
0501デフォルトの名無しさん2008/02/11(月) 17:01:05
>>497-499
なるほど。staticなら早いだろうなってのは
予想してたけど、表記のネストも可能になるんだ。
0502デフォルトの名無しさん2008/02/12(火) 20:48:21
boost.python
python.numpy
をこれから使いまくろうと思ってる
0503デフォルトの名無しさん2008/02/12(火) 23:42:49
rule hoge ( name ) {
  exe $(name) : ./$(name).cpp ;
  exec $(name)-run : $(name) ;
}
local hogehoge = [ modules.peek : ARGV ] ;
hoge [ MATCH "^--name=(.*)" : $(hogehoge[2]) ] ;

bjam --name="projectname"
で実行時にターゲットを生成するルールhoge
これで使い捨てのコードをeditorのマクロで一発テストできるぞ!!

boost-jamって各種コンパイラ用のプリセットがある点以外はかなり貧弱にみえるけど
そうでもないの?皆使ってる??
05045032008/02/13(水) 00:07:56
ごめん上のコードは忘れて
保存して忘れた頃に晒すとかしないでね


>>500
boost/algorithm/string/find.hpp内でusing boost::algorithm::findしているのが原因
ってのはわかるけど
解決策は「どちらか一方だけを使う」ぐらいしか思いつかない
でもまぁ捨てるとしたらrange_exの方かな…
同じようなものにovenがあるし
05055002008/02/13(水) 02:20:01
うわ本当だ。
boost名前空間へ引きづり出されているとは、知りませんでしたOTL。
問題のところは、std::findへ逃げました。
0506デフォルトの名無しさん2008/02/15(金) 12:35:34
>>503
cmakeとどっちが便利なんだろう
cmakeはドキュメントそろってるけどbjamにはない
0507デフォルトの名無しさん2008/02/15(金) 16:47:32
autotoolsじゃないと使いたくない
0508デフォルトの名無しさん2008/02/15(金) 16:52:47
scons
0509デフォルトの名無しさん2008/02/17(日) 21:20:32
http://www.nazystyle.net/boost/install_and_build.shtml
boost 1.341をダウンロードしてここを参考にしてコンパイルしたけど、
D:\Documents and Settings\habu\デスクトップ\boost_1_34_1\tools\build\v2/kernel/bootstrap.jam:82: in boost-build
IMPORT error: rule "import" unknown in module "modules."
D:\Documents and Settings\habu\デスクトップ\boost_1_34_1\boost-build.jam:9: in module scope
と言うエラーが出て先に進めません。
根本的に何か間違っているのでしょうか?

仕方ないので今は渋々インクルードファイルだけを使っていますが・・・。
0510デフォルトの名無しさん2008/02/17(日) 21:22:54
すいません。環境書き忘れました。
Visual C++6.0でWindows XPで動作させています。
0511デフォルトの名無しさん2008/02/17(日) 21:26:33
vc6だと使えないのが多い罠
0512デフォルトの名無しさん2008/02/17(日) 21:32:59
ユーザ名くらい隠そうよ
0513デフォルトの名無しさん2008/02/17(日) 21:43:10
>512
しまった・・・・まあいいや、本名じゃないし。
0514デフォルトの名無しさん2008/02/18(月) 02:22:56
g++4.1.2 boost1.35.1-5 で boost::algorithm::trim なんだけど

vector<string> vecstr; に適当に値を代入して

trim( vecstr[0] );
だとダメ(trim.hpp:229 で no much function.)で
trim( vecstr.at(0) );
もダメだけど

string tmp =vecstr[0];
trim( tmp );
だと通ってしまう。これらってC++的には同じでないの?
(atは領域外だと例外投げるとかをのぞいて)
05155142008/02/18(月) 02:26:57
すみません。vecstrにconst付けてました。サーセン。
0516デフォルトの名無しさん2008/02/18(月) 08:38:52
>>514
それ以前に、trim(& vecstr[0])じゃないのか?
0517デフォルトの名無しさん2008/02/18(月) 11:33:21
ヘッダファイルに次のように書いて
public:
typedef boost::multi_array<double, 2> MyArray;

ある関数の中で

ある関数(){
int Arraylen

Ararylen=3

MyArray A( boost::extents[4],[Arraylen]);

}

とした場合Aと言う変数がこの関数の中で作られているので
どうグローバル化していいか分かりません。
ちなみに、この例ではArraylenの値がすぐ分かるように
なっていますが、自分のプログラムではこの値はその関数内
でしか分かりません。
0518デフォルトの名無しさん2008/02/18(月) 12:43:19
public:
typedef boost::multi_array<double, 2> ;
MyArray A;


ある関数(){
int Arraylen

Ararylen=3

A( boost::extents[4],[Arraylen]);

}

こうやってもダメでしたね。
0519デフォルトの名無しさん2008/02/18(月) 12:46:13
>518
じゃなくて、こうしたらだめでしたね。
0520デフォルトの名無しさん2008/02/18(月) 12:47:32
>518
間違えました。
typedef boost::multi_array<double, 2> MyArray ;
です。
0521デフォルトの名無しさん2008/02/18(月) 12:54:54
他にもつっこみどころが
0522デフォルトの名無しさん2008/02/18(月) 14:36:49
>521
つっこんでよ。
0523デフォルトの名無しさん2008/02/18(月) 14:40:21
>522
細かい文法 ;が無いとか以外に。
引数で渡したら二度手間だしなるべくやりたくありません。
0524デフォルトの名無しさん2008/02/18(月) 16:02:41
ようするにAをPublic変数みたいな感じに
使えないかと。
0525デフォルトの名無しさん2008/02/18(月) 16:50:14
public:
int arraylen;
typedef boost::multi_array<double, 2> MyArray;
MyArray A( boost::extents[4][arraylen]);

こうやってもだめですね。
0526デフォルトの名無しさん2008/02/18(月) 16:53:00
>525
ちなみに、
class CxxDoc : public CDocumen
{
......

等は省略しています。
0527デフォルトの名無しさん2008/02/18(月) 19:21:13
public:
boost::multi_array<double, 2> MyArray;



ある関数(){
int Arraylen;

Ararylen=3;

MyArray ( boost::extents[4],[Arraylen]);

}
これでもダメだったので、
public::
std::vector< boost::array<double,4> > MyArray;
int Arraylen;

Ararylen=3;

MyArray.resize(Arraylen);

}
としました。
もっといいやり方があったらお願いします。
0528デフォルトの名無しさん2008/02/18(月) 19:22:58
>>518
デフォルトコンストラクタで空のmulti_arrayを作っておいて、
関数内でmulti_array::resizeを使えばいいんじゃ?

public:
typedef boost::multi_array<double, 2>;
MyArray A;

ある関数() {
  int Arraylen;
  Ararylen=3;
  A.resize(boost::extents[4],[Arraylen]);
}
0529デフォルトの名無しさん2008/02/18(月) 22:17:38
>528
ああ、まさにそれです。
ありがとうございます。
boost自体をまだ勉強しないとダメですね。
0530デフォルトの名無しさん2008/02/18(月) 22:33:30
VC6でboostのヘッダだけ入れてる状態で、boost::array等を使うと
warningエラーが出ますが、正常に動いています。
気にしなくても大丈夫でしょうか?
また、boostをきちんとビルドして入れると違いますか?
ビルドがうまくいかないもので比較ができません・・・。
0531デフォルトの名無しさん2008/02/18(月) 22:53:38
warningエラー
0532デフォルトの名無しさん2008/02/18(月) 23:03:44
http://d.hatena.ne.jp/kaz_kushima/

現在の最新版(Ver 1.34.1)ではVC6はサポート対象外になった…という噂を聞いたので試していない。

初心者には厳しすぎる事実・・・。
0533デフォルトの名無しさん2008/02/18(月) 23:08:35
>532
VC2005EEか2008EE入れればすむ話なのでは
0534デフォルトの名無しさん2008/02/18(月) 23:17:26
>533
NET Frameworkを入れたくないんです・・・。
一度入れたけど、すごくXPが重くなった。
それにバカだからMFCのAPPWizardが無いとちょっときつい。
0535デフォルトの名無しさん2008/02/18(月) 23:42:38
>530
どうやらデスクトップでコマンドプロンプトを使うと、名前が長すぎるか、
それとも日本語に対応していないか?でうまくコンパイルができないみたい。
C:\にしたら問題有りませんでした。
0536デフォルトの名無しさん2008/02/18(月) 23:53:51
>530は『VC6はC++じゃない』ということを理解すべき。
素直にVisual Studio Standard Edition 買った方がいいんじゃない?
2008にするかどうかは悩ましいところだけど。
わざわざ使い物にならないバッドノウハウの世界に突っ込むこともないと思う。
0537デフォルトの名無しさん2008/02/19(火) 00:18:41
>536
わざわざ新しい物買うの?
欲しいのは山々だけどお金が・・・。
Enterprise買ったの失敗だったかな?
MFCに捨てたらほとんどWin32APIの世界で
やらないといけないようなイメージがあって
辛い。
0538デフォルトの名無しさん2008/02/19(火) 01:00:50
>>537
VC6自体というかVC6のC++コンパイラな。だめなのは。
というか、コンパイラだけなら今のSDKのやつが使えないかね。
0539デフォルトの名無しさん2008/02/19(火) 01:05:24
ExpressEditionならタダだろ
0540デフォルトの名無しさん2008/02/19(火) 01:10:12
>538
そうですか?
失礼しました。
ところでlibsのなかにいろいろとできているのですが、ライブラリの拡張子が
何か教えてください。
0541デフォルトの名無しさん2008/02/19(火) 01:11:38
>539
ExpressEditionでALTを使ってやっているんですかみなさん?
0542デフォルトの名無しさん2008/02/19(火) 01:11:58
>537
自分から泥沼にはまるつもりなら止めはしないけど。
まあ、アップグレードでも2万円するしね。

そういや、前のバージョンならExpressEditionからもアップグレードできるのね。知らんかった。
0543デフォルトの名無しさん2008/02/19(火) 01:17:49
なぜいきなりATL(だよな?)の話が
0544デフォルトの名無しさん2008/02/19(火) 01:43:15
>542
NETFRAMEWORKいれるの覚悟でなんとかやってみる。
まずはフリーから。
0545デフォルトの名無しさん2008/02/19(火) 01:59:30
ELTは良い曲だすよね
0546デフォルトの名無しさん2008/02/19(火) 02:04:43
よくキーボードマニアでやったなぁ>ELT
0547デフォルトの名無しさん2008/02/19(火) 08:16:22
MFCを捨ててWTLをやってみないか。
0548デフォルトの名無しさん2008/02/19(火) 08:23:30
>>537
MFCのことはさっさと忘れろ
VC2005の無料版でboost+wxWidgetsで幸せになろうぜ
0549デフォルトの名無しさん2008/02/19(火) 09:44:05
GUIはC#で書いて、マネージ/アンマネージ間をC++/CLIで橋渡しする。
0550デフォルトの名無しさん2008/02/19(火) 11:07:10
GUIはguile-gtk
0551デフォルトの名無しさん2008/02/19(火) 15:02:48
そういや、Boost GUI ってどうなったんだろ
0552デフォルトの名無しさん2008/02/19(火) 17:58:19
Boost.Actもどこいったのやら
0553デフォルトの名無しさん2008/02/19(火) 18:03:11
Boost で GUI ってまさか GUI Buider?
全然似合わないけど。
0554デフォルトの名無しさん2008/02/19(火) 18:16:43
Boost 1.35ってどこで入手すればいいですか?
0555デフォルトの名無しさん2008/02/20(水) 00:37:54
svn
0556デフォルトの名無しさん2008/02/20(水) 10:16:18
>>549
C++/CLIだとC#からダイレクトに橋渡しするより楽なん?
0557デフォルトの名無しさん2008/02/20(水) 10:17:51
橋渡しは、WinDNAの悲劇の再来。
0558デフォルトの名無しさん2008/02/20(水) 14:07:07
>>556
クラスとかC++の機能を使ったライブラリが難なく取り込めたり、
<windows.h>ほか多数のヘッダが存在するから
関数プロトタイプをいちいち調べて書かなくてよかったりする。
0559デフォルトの名無しさん2008/02/21(木) 00:06:52
Boostをsvnから取ってきて数日たったあとsvn更新するとけっこう変更ファイルあるみたいなんだけど、
みんなはどのタイミングのをビルドしてる?
0560デフォルトの名無しさん2008/02/21(木) 07:52:59
自分が使うライブラリが更新された時。
あとは気が向いたら。
ビルドしたものは全部残しているから何か挙動がおかしければ
自分のプログラムのユニットテストで引っ掛かるからすぐ戻す。
いままで戻したことは無いけど。
ユニットテストは特にフレームワークを使っている訳じゃなくて
単にアサーションの連続だけど。
0561デフォルトの名無しさん2008/02/21(木) 14:18:47
Boostの正規表現で(?<!)や(?<=)は使えますか?
0562デフォルトの名無しさん2008/02/21(木) 16:42:20
regexでもxpressiveでも使えたはず。
0563デフォルトの名無しさん2008/02/21(木) 23:57:33
>>562
boost::regexpを利用したテストツールらしいのですが、
ttp://www.vector.co.jp/soft/winnt/util/se385428.html
(?<=)が使えなかったので。
このソフト固有の問題ですかね
0564デフォルトの名無しさん2008/02/22(金) 00:14:29
boost のドキュメント見ればサポートしている表現は書いてあるだろ
0565デフォルトの名無しさん2008/02/22(金) 01:34:09
enable_shared_from_this
は1クラスしか対応してない?

class MyName
:public IClass
,public IName
,boost::enable_shared_from_this<IClass>
,boost::enable_shared_from_this<IName>
{
public:
virtual boost::shared_ptr<IClass> get_class()
{
return shared_from_this();
}
virtual boost::shared_ptr<IName> get_name()
{
return shared_from_this();
}
};
0566デフォルトの名無しさん2008/02/22(金) 01:42:23
エラーになる理由はpublic継承でないからに見えるけど、そもそも単にこうでいいと思う。
class MyName
:public IClass
,public IName
,boost::enable_shared_from_this<MyName>
{
public:
virtual boost::shared_ptr<IClass> get_class()
{
return shared_from_this();
}
virtual boost::shared_ptr<IName> get_name()
{
return shared_from_this();
}
};
T*からU*へ暗黙の変換が可能なら、shared_ptr<T>からshared_ptr<U>への暗黙の変換も可能。
0567デフォルトの名無しさん2008/02/22(金) 01:42:46
って俺もpublicにしていないしorz
05685652008/02/22(金) 02:09:54
コンパイルは通るけど実行すると
bad_weak_ptr飛んでくる
0569デフォルトの名無しさん2008/02/22(金) 02:20:29
まさかとは思うけど、shared_ptrに入れていないMyNameインスタンスに対して
get_classやget_nameを呼んでいるなんてことはないよね?
05705652008/02/22(金) 02:28:38
>>569
そういうことかああー
ありがとう。
0571デフォルトの名無しさん2008/02/22(金) 02:40:49
みんなBoost v1.35をsvnから取ってきて自前でコンパイルしてるのですか?
0572デフォルトの名無しさん2008/02/22(金) 02:55:00
みんなって言われても俺一人じゃ答えられない(><)
0573デフォルトの名無しさん2008/02/22(金) 02:59:54
最近あちこちでウザいアンケート多すぎ
0574デフォルトの名無しさん2008/02/22(金) 03:05:35
>>206使ってるんじゃないの?
0575デフォルトの名無しさん2008/02/22(金) 16:34:29
ウザくてごめんなさい
もう消えます・・・
0576デフォルトの名無しさん2008/02/22(金) 17:10:02
最近同じやり取りが>>559-560でされてるから煽られても仕方ない。
消える必要までは感じないが、過去レスを見てから、死ぬがよい。
0577デフォルトの名無しさん2008/02/22(金) 17:43:18
色々過去ログを見てきたので消えます。
皆さん達者で
0578デフォルトの名無しさん2008/02/22(金) 18:43:17
boost::bindでstdcallな関数使う場合はBOOST_BIND_ENABLE_STDCALLを定義すればいいんだけど、
lambda::bindでstdcallな関数を使いたい場合は方法ってあるんでしょうか。
VC++2008です。

vector<ATL::CString> v; ってのを使ってて大文字小文字無視ソートがしたくて、

 sort(v.begin(), v.end(), boost::lambda::bind(lstrcmpi, _1, _2) < 0);

これだとエラー。cdeclなCRT関数使うと動く…

 sort(v.begin(), v.end(), boost::lambda::bind(_tcsicmp, _1, _2) < 0);

もちろん大文字小文字を無視しないソートするだけなら

 sort(v.begin(), v.end(), _1 < _2);

なんだけど…
0579デフォルトの名無しさん2008/02/23(土) 17:09:40
boost::Poolライブラリ使ってる人いる?
ちょっと使ってみたら、確かにデフォルトnew、deleteより
全然速かったんだけど、手放せないという人いる?
0580デフォルトの名無しさん2008/02/23(土) 17:42:29
コピーすると自動的にディープコピーになる
boost::scoped_ptr の変種って便利じゃね?
0581デフォルトの名無しさん2008/02/23(土) 18:14:53
「ディープコピー」の振舞いを決めるのが難しい。
普通にコピーコンストラクタ組むのとあんまり手間変わらんし。
0582デフォルトの名無しさん2008/02/23(土) 18:17:45
難しい?コピーコンストラクタを呼ぶだけじゃないか?
>>580は要するに最大sizeが1のvectorだから、設計上の困難はなさそうだけど
0583デフォルトの名無しさん2008/02/23(土) 18:27:10
深い構造体は同値性一つ取っても、
多種多様な意味付け方があるし、コピーだって同じだよ。

Lispみたいにメモリ管理については無視していい言語でさえ、
同値性は4つの述語関数がある。

>>581はそういうこと言っていると思う。

まあどれか決め撃ちで作ったり、
テンプレートでコンパイル時に選べるのを作るのは面白いと思う。
0584デフォルトの名無しさん2008/02/23(土) 18:41:17
>>583
その色んな意味付けから一つ選んでコピーコンストラクタの振る舞いを決めるのがC++のやりかたじゃないか?
実際にコピーを行う側は盲目的にコピーコンストラクタを呼んで、実際にどこまで深くコピーするかはコピーコンストラクタが決める

同様に、C++には標準的な同値性は二種類しかない
オブジェクトとしての同一性と、operator==
05855812008/02/23(土) 18:59:10
>580 >584
むむむ?なんかハッキリしないなぁ
値の振舞いとの違いは何?boost::scoped_ptrに何を期待してるの?
0586デフォルトの名無しさん2008/02/23(土) 19:04:58
optional使えよ
05875842008/02/23(土) 19:05:26
>>585
俺は>>580じゃないよ
値との違いは、NULLになり得るとか、resetが使えるとか、コピーなしでswapできるとか、そんなんじゃね
05885812008/02/23(土) 19:58:46
>587
その程度だと「boost::any使ってみたら?」でお仕舞いだなあ。
多態は使えんけど。
0589デフォルトの名無しさん2008/02/23(土) 20:02:38
class A {
...
scoped_ptr<B> p;
...
};

A a;

で,p の指している先のオブジェクトに dereference するには
*(a->p) って書くと思うんですが。a->p まで書いていちいち
前に戻って *( って書くしかないですかね。
左から右に自然と書きたければ a->p.operator*() とか?
0590デフォルトの名無しさん2008/02/23(土) 20:04:51
あ、ごめん、A a じゃなくて A *a と読みかえてください。
0591デフォルトの名無しさん2008/02/23(土) 20:14:30
普通に最初から * ( と書き始めればいい。
0592デフォルトの名無しさん2008/02/23(土) 20:20:28
なんで括弧使うの?
0593デフォルトの名無しさん2008/02/23(土) 20:24:05
内部データの「ハンドル」を返え、
あ、いや、なんでもないです。。。
0594デフォルトの名無しさん2008/02/23(土) 20:24:14
あれ?優先度間違って覚えてる?俺。
0595デフォルトの名無しさん2008/02/23(土) 20:34:30
あっても無害だけど不要。
0596デフォルトの名無しさん2008/02/23(土) 20:41:29
*a->p; だとまず * は a に作用するんだと思ってた。
先に -> が働いてから * が働くのか。
■ このスレッドは過去ログ倉庫に格納されています