トップページ⇒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/
0091デフォルトの名無しさん2007/11/26(月) 19:30:10
>>88
>>89
>>90
レスありがとうございます。
やはり複数の関数定義があるからなんでしょうかね。
実行はできるので、実装を受け入れることにします。
0092デフォルトの名無しさん2007/11/26(月) 22:39:40
template特殊化じゃなくて、overloadだとね。

template<typename _Tp> inline _Tp mysqrt(_Tp __x) { return sqrt(__x); }
なら、
cout << bind(mysqrt<double>, _1)(x) << endl;
できるけど。doubleで特殊化されてようとされてなかろうと。

0093デフォルトの名無しさん2007/11/27(火) 01:46:48
ただオーバーロードの名前解決ルールに従うとビッチリdoubleを
指定してるわけだからdouble sqrt(double)を特定できる
はずなんですけどね。コンパイルエラーにもambiguousとは出ていない
ようですし。
0094デフォルトの名無しさん2007/11/28(水) 23:07:10
>93
double を指定しているのは戻り値の型であって、sqrt() の引数の型には寄与してないから特定できないんじゃない?
x の型は bind の解釈には無関係だよね?
0095デフォルトの名無しさん2007/11/29(木) 00:58:51
>>94
_1 は確か引数じゃないかな?戻り値ではないと思ったけど。
0096デフォルトの名無しさん2007/11/29(木) 03:42:26
xpressiveを勉強しているのですがa|b(aまたはb)がうまく動きません

using namespace boost::xpressive;
sregex tok =
 as_xpr("hoge") >> (("!">>~before(eos)) | ("!!">>~before(eos)) | eos);

smatch m;
const std::string addr("hoge!hoge!!hoge!");
std::string::const_iterator it = addr.begin(), end = addr.end();
 
for( ; regex_search(it, end, m, tok, regex_constants::match_continuous)
   ; it = m[0].second )
{
 std::cout << m[0] << std::endl;
}
このコードで
hoge!
hoge!!
hoge!
と出力されると思ったのですが
hoge!
hoge!
で終わってしまいます
0097962007/11/29(木) 03:46:41
申し訳ございません 間違えました
検証に使った文字列は
const std::string addr("hoge!hoge!!hoge");
です
0098デフォルトの名無しさん2007/11/29(木) 10:35:19
sregex tok =
 as_xpr("hoge") >> (("!!">>~before(eos)) | ("!">>~before(eos)) | eos);


だろ。普通は
0099デフォルトの名無しさん2007/11/29(木) 12:35:47
ファンクたを合成したいんだけど、
compose_f_gx_hx とかって Visual C++ 2005 の
STL には入ってないの? ファンクタの合成って
boost::compose か何かが必須?

なんか俺勘違いしてるのかな。
0100992007/11/29(木) 12:38:12
あれ?Boost.Compose って deprecated ?
0101デフォルトの名無しさん2007/11/29(木) 12:40:01
lambda::bindを使って
bind(&f, bind(&g, _1))
な風に
でも>>13のように呼び出し規約が__stdcallの関数については使えないようだ
mlには使えるって書いてあるんだけどねぇ・・・誰か使えた人いないのかなぁ
0102992007/11/29(木) 12:48:31
#include <boost/lambda/bind.hpp>
boost::lambda::bind

#include <boost/bind.hpp>
boost::bind

どちらを使うべきなのでしょうか?
0103デフォルトの名無しさん2007/11/29(木) 12:53:19
合成関数目的ならどっちでもいけるけど
__stdcallのものにでも使えるという点でboost::bindかな・・・
0104992007/11/29(木) 12:56:54
THX.
ところで、ファンクタの合成って標準のSTLには入ってないよね?
SGIのだけに入ってるとか、そういうことあるのかな?
少なくとも Visual C++ だと compose_f_gx_hx などはありませんでした。
boost::bind のほうがもっと柔軟だから compose_f_gx_hx いらないけど。
0105デフォルトの名無しさん2007/11/29(木) 22:56:21
>104
標準化される前の SGI STL には compose1, compose2 があった。っていうか今もある。
現行の標準規格には入っていない。
compose_f_gx_hx は Boost.Compose での名前。
C++0x では Bind が標準に入るので今後は bind 使えになると思われ。
0106デフォルトの名無しさん2007/11/30(金) 02:01:44
Scott Meyers' Effective C++: TR1 Information
http://www.aristeia.com/EC3E/TR1_info_frames.html

266 tr1::bind Function Object Binders n1455
0107992007/11/30(金) 15:00:08
_1 とか _2 って boost::lambda 名前空間以下にしかないよね?
boost::bind も併用しているんだけど、
そうすると ambiguous って言われる?
0108デフォルトの名無しさん2007/11/30(金) 15:12:46
言われる
0109992007/11/30(金) 15:15:54
だは〜
無名名前空間の下に見えてる _1 はどっから来たものか・・・
#include <boost/bind.hpp> だろうなぁ。
::_1 って指定してやらないとダメみたい。
0110デフォルトの名無しさん2007/12/02(日) 18:50:17
Visual C++ 2008 Express Edition だとさらに
果敢に IntelliSense が攻めてくれるね.

だけどまた boost をリビルドしなきゃならんのか…
今からやろうと思うんだけど, svn trunk から
とってきたのを直接ビルドしてみようと思う.無謀?
01111102007/12/02(日) 18:58:00
http://svn.boost.org/svn/boost/trunk/boost/config/auto_link.hpp

#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1500)
# define BOOST_LIB_TOOLSET "vc90"

ってことは,すでに trunk では対応しているのか.
退行テストも通ってるのかな.しかし svn から export
して持ってきたものをどうやってビルドするのかわからん・・
01121102007/12/02(日) 19:24:56
bjam ビルド中。
あっさり toolset 名として vc9 が検出されたみたい。
つーか、bjam をビルドしようとして build_dist.bat を
実行したらすでに本体のビルドまで勝手にやってくれているのだが・・・
以前ビルドしたときとは大違いに楽になってる気がする。
0113110のチラシの裏2007/12/02(日) 19:31:29
ごめん、ウソ。いま改めて
bjam.exe --build-dir=builddir --toolset=msvc-vc9express stage
やってます。Express Edition は固有の toolset 名を持ってるのか?
もしかして 64 ビット版のライブラリをビルドするか否かを決定してる?
0114110のチラシの裏2007/12/02(日) 19:37:30
しかし Graph とか正規表現ライブラリの Unicode サポートとか
使おうと思ったら expat や icu4c も vc9 でビルドしなおさなきゃ
らんのかなぁ。

って、記憶をたどってみると、両ライブラリとも単独で使った
ことがあるんだけど、vc7 と vc8 で同じバイナリをリンクしてた
きがするのだが・・・ boost はなんでリビルドしなきゃならないの?

とはいえ、 vc8 用にビルドした boost を vc9 でビルドしてる
アプリケーションからリンクするとリンカが怒るので仕方ない。
0115110のチラシの裏2007/12/02(日) 19:59:26
Visual C++ 2008 Express Edition で 1.35 ビルド終了。
failed 2 って出たけど、どこで失敗したのかわからん。
bjam はログを残してくれないのか?
0116デフォルトの名無しさん2007/12/02(日) 20:10:38
(bjam ほにゃらら 2> err.txt) > log.txt
0117110のチラシの裏2007/12/02(日) 20:17:39
え、Windows の cmd.exe でも stderr のリダイレクトできたのか。
bash ばっかりだからしらんかった。
01181102007/12/03(月) 00:12:14
bjam で --toolset=msvc-vc90 にしてるのに
libboost_graph-vc-mt-gd-1_35.lib
みたいにライブラリファイルの名前中のツールセット名が
-vc- になるのは、なぜ〜〜〜?

自分で変更するのタルい。
0119デフォルトの名無しさん2007/12/03(月) 00:34:06
Boost.BuildがV2になった直後はそんな話も出てたような
まぁperlかPowerShell使えばリネームなんて簡単だろ
0120デフォルトの名無しさん2007/12/03(月) 00:34:49
前に同じような減少に見舞われたときは
原因を調べるもの面倒だったからファイル名を一括置換した
なんでそうなるんだろうなあ
01211102007/12/03(月) 05:34:34
>>119
まぁリネーム自体は簡単なんだろうけど,そもそも
ツールセット名ってどっかで正規化されていないのかと.
bjam で指定するツールセット名も msvc だけでも
受け入れられるし, msvc-vc8 や msvc-vc80 なども
変に柔軟に受け入れられるけど,オートリンクでは vc80
とか指定してくるし…

「自分でつけた名前だろ!自分でオートリンクできずにどうするよ!」
って突っ込みを入れたくなった.
01221102007/12/03(月) 09:08:54
ツールセット名は msvc-8.0 と msvc-9.0 にすると
ちゃんと vc80 と vc90 って文字がライブラリのファイル名に含まれます。

msvc / msvc-vc80 / msvc-vc90 も受け入れられるけど、
そうするとライブラリのファイル名におけるツールセットの部分が
vc になってしまってオートリンクなどで都合が悪いです。
0123110自分用メモ2007/12/03(月) 09:41:13
V:\boost-vc8>bjam --builddir=builddir --build-type=complete
--toolset=msvc-8.0 stage

V:\boost-vc9>bjam --builddir=builddir --build-type=complete
--toolset=msvc-9.0 stage
0124デフォルトの名無しさん2007/12/05(水) 12:27:20
BOOST_STRONG_TYPEDEF マクロって,テンプレート版ないのかな?
typedef StrongTypedef<int> MyIntType;
みたいに使いたい.自分で勝手に上のような使い方をしてるけど,
標準があるならそちらに従いたい.

あと,BOOST_STRONG_TYPEDEF って totally_ordered しか
持っていないけど,もっと一般に additive とかそういうのを
持っているバージョンもあればいいと思う.

さらに serialization にも対応してたらいいなぁ.

#全部「おまえがやれ,自由に」と言われそうだけど
#標準が決まってるほうが可読性が上がると思う.
0125デフォルトの名無しさん2007/12/05(水) 14:12:06
>>124
> もっと一般に additive とかそういうのを
> 持っているバージョンもあればいいと思う.

具体的にはどういう型の時なの? additiveが有効なのは。

この辺は、 class NAME##_archetype { ってマクロでやってるから、
テンプレートに文字列処理がないとテンプレートだけでやるのは厳しいね。
0126デフォルトの名無しさん2007/12/05(水) 21:17:01
bjamでビルドするときコンパイラに追加で渡したいフラグを設定するにはどのようにすればよいですか?

warning C4996: 'std::XXX': Function call with parameters that may be unsafeとうるさいので
bjam --toolset=msvc-9.0express "--cxxflags=/wd4996" stage
としてみたのですがガンガンwarning C4996が報告されてしまいます

できればboost/config/user.hppとかをいじくらずbjamのオプションとかで渡したいです
0127デフォルトの名無しさん2007/12/05(水) 21:20:50
bjamのオプションもたぶんあるんだろうけど、
わかんなかったら環境変数CLを使えばよいんじゃないかな。
01281262007/12/05(水) 21:45:28
わぉ 環境変数はずっとCFLAGSに設定してました
ありがとうございます
0129デフォルトの名無しさん2007/12/07(金) 07:57:36
scoped_ptr の実装を見て operator! が定義されているから
safe bool idiom にしようとおもって scoped_ptr を
継承した my_scoped_ptr を作ったら conversion が
ambiguous だって怒られた.
0130デフォルトの名無しさん2007/12/07(金) 10:07:16
class A : public B のようにクラスを継承しています。
B に非侵入型の serialize が定義されている場合には
A の serialize も非侵入型にしなくてはならないのでしょうか?
01311302007/12/07(金) 11:04:41
すみません、自分の勘違いだったようです。
boost::serialization 関係でもうひとつですが,
BOOST_STRONG_TYPEDF で定義した型はそのまま
シリアライズできないのでしょうか?
自分で非侵入型の serialize を定義するべきですか?

http://boost.org/libs/serialization/doc/wrappers.html
ここを見ると BOSOT_STRONG_TYPEDEF(T,D) で作った型 D
をシリアライズする際には T に自動的に変換されるので
そのままでいい、ということのようですし、実際
BOOST_STRONG_TYPEDEF マクロの定義を見ても
そこで定義されている構造体には確かに変換が用意されているようなのですが
0132デフォルトの名無しさん2007/12/08(土) 12:44:00
Boost.Preprocessorで、BOOST_PP_CAT(t, Foo)が
tFoo でなく tWFoo と展開されたのだが・・・

t が他の文字ならおkで、また別のプロジェクトだと tFoo と正しく展開された。
ずっと解決できないので誰かご教授ください m(_ _)m
0133デフォルトの名無しさん2007/12/08(土) 13:06:20
>>132
tっていうマクロかtFooっていうマクロが定義されてるとか?
0134デフォルトの名無しさん2007/12/08(土) 21:19:07
boost::bindで拘束する変数はコピー可能なオブジェクトでないと駄目ですか?
0135デフォルトの名無しさん2007/12/08(土) 21:39:51
>>134 ref、cref
0136デフォルトの名無しさん2007/12/08(土) 21:43:20
>>135
ありがとう
01371322007/12/09(日) 05:28:54
>>133
左手のトークンの末尾が 't' だと駄目なようです。
BOOST_PP_CAT(Get, Hoge) とか BOOST_PP_CAT(Object, Piyo) とか。
0138デフォルトの名無しさん2007/12/09(日) 08:20:28
>>137
それはもしかしてプリプロセッサのバグじゃないか?
使ってるプリプロセッサ何?
01391322007/12/09(日) 08:59:35
>>138
VC++ Express 2005 です。
新規プロジェクト作り直して丸ごと移したら正常にコンパイル出来ました・・・
何か気持ち悪いけど、どこかプロジェクトの設定が壊れてたのだと思います。
お騒がせしました。
01401322007/12/09(日) 09:49:06
と思ったらまた再発したorz 何だこれ
0141デフォルトの名無しさん2007/12/09(日) 10:28:26
2005でboost使うのは辞めてくれ。
stdとtr1だけにしとけ
0142デフォルトの名無しさん2007/12/09(日) 10:37:55
>>141
VC++7.1 は対応度高かったと思うけど 2005 だともしかして劣化してる?
2008 beta はどうなんだろ。
0143デフォルトの名無しさん2007/12/09(日) 11:51:47
初耳だな
0144デフォルトの名無しさん2007/12/09(日) 12:04:45
>>142
2008はもう正式版出ているw
0145デフォルトの名無しさん2007/12/09(日) 12:56:18
>>141
何の問題もないが.
時々 IntelliSense が黙るだけで.
VC9 ではかなり賢くなってる.
それでも boost::bind つかいまくりで
ファンクタ合成しまくりとかで黙ることもある.
0146デフォルトの名無しさん2007/12/09(日) 14:09:37
VC8だとuBLASにlambdaにfunctionにmplまで使ったらclがエラーで落ちたことがあったな。
SP1当てたら大丈夫になったけどさ。
0147デフォルトの名無しさん2007/12/10(月) 14:24:36
boost::shared_ptr の参照カウンタがゼロになったときに、
delete 以外の解放処理を行わせる方法はありますでしょうか。

extern IMalloc* allocator;
{
boost::shared_ptr<ITEMIDLIST> pidl((ITEMIDLIST*)allocator->Alloc(10));
}
//ここでallocator->Freeを呼ばせたい
0148デフォルトの名無しさん2007/12/10(月) 14:36:59
>>147
デリータを指定できるコンストラクタがあるよ。

template <typename U, typename D>
  shared_ptr( U* ptr, D deleter);

01491472007/12/10(月) 15:08:43
おぉぉ、ありがとうございます。
解決しますた。
クラス全体のテンプレート引数 (1個しか無い) にしか目がいってなくて、
コンストラクタのところを見てなかったです。orz
0150デフォルトの名無しさん2007/12/11(火) 00:49:05
>>149
焦っている時にありがちな罠だから落ち着いて資料を読めばいいと思うよ。(自分への叱咤でもありorz)
0151デフォルトの名無しさん2007/12/11(火) 02:45:26
msvc+stlportの環境下で、Boost Build v2で、boostをインストールした人って
いませんか?

VC++8 + STLport-5.1.4 に boost-1.34.1 を入れようとして、
Boostビルドまでは何とかこぎ着けたのですが(コンパイルエラーなしで)、
いざ、boostを使ったプログラムをメイクしようとすると、

error LNK2019: 未解決の外部シンボル
"bool __cdecl boost::filesystem::native(class stlpd_std::basic_string<char,class stlpd_std::char_traits<char>,class stlpd_std::allocator<char> > const &)"
(?native@filesystem@boost@@YA_NABV?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@@Z)
が関数 _main で参照されました。

なんていうリンクエラーが出てしまいます。
0152デフォルトの名無しさん2007/12/11(火) 03:53:33
ライブラリをリンクしろ。
0153デフォルトの名無しさん2007/12/11(火) 08:58:58
環境の判定に BOOST_PLATFORM マクロを使おうと
思ってるんだけど、プリプロセッサって
文字列の比較できないよね?
環境の判定によいアイディアあったら教えてプリーズ。
01541512007/12/11(火) 09:54:39
>>152
[ツール]→[オプション]→[プロジェクトおよびソリューション]→[VC++ディレクトリ]で、
ライブラリファイルのディレクトリとして、
C:\Boost\lib
を追加済みです。

さらに、プロジェクトのプロパティページで、
[構成プロパティ]→[リンカ]→[入力]→[追加の依存ファイル]で、
boost_filesystem-vc80-mt-gdp-1_34_1.lib
を追加してみたのですが、ダメでした。(:_;)
0155デフォルトの名無しさん2007/12/11(火) 11:39:13
>>154=151
普通は「追加の依存ファイル」なんて設定しなくても
オートリンクで適切なライブラリをリンクしてくれるはずなんだけどなぁ。
って STLPort 使ってない俺が言っても意味ないよね。
01561512007/12/11(火) 14:38:29
>>155
のはずなんだけど・・・。
v1のときは、普通にリンクできていたので。
なんというv2。

何も情報を出さないのはアレなんで、
ビルドフロー(失敗している奴)をここにまとめておきます。

Visual C++ 8.0 with SP1
STLport-5.1.4
 → C:\STLport-5.1.4 として解凍。
boost-1.34.1
 → C:\boost-1_34_1 として解凍。

OS: Microsoft Windows SP2
CPU: Intel
01571512007/12/11(火) 14:39:01
■STLport

stlport/stl/config/user_config.h の
 #define _STLP_USE_BOOST_SUPPORT 1
を有効にする。

> "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat"
を実行。

環境変数に、
 STLP_BUILD_BOOST_PATH=C:\boost_1_34_1
を追加。

> cd build\lib
> configure -c msvc8 --use-boost=C:\boost_1_34_1
> nmake /fmsvc.mak install
でSTLPortをビルド。
01581512007/12/11(火) 14:41:47
■boost

stlport.jamファイルの不具合を修正する。
 http://lists.boost.org/boost-build/2007/08/17123.php参照

user-config.jamファイルを編集する。
 using msvc : 8.0 ;
 using stlport : 5.1.4 : C:/STLport-5.1.4 ;

環境変数を設定する。vsvars32.bat
 @set STLPORT_PATH=C:\STLport-5.1.4
 @set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;C:\S
 TLport-5.1.4\stlport;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;C:\
 Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program File
 s\Microsoft Visual Studio 8\SDK\v2.0\include;%INCLUDE%
 @set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;C:\STLport-
 5.1.4\lib;C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\M
 icrosoft Visual Studio 8\VC\PlatformSDK\lib;C:\Program Files\Microsoft Visual
 Studio 8\SDK\v2.0\lib;%LIB%
(実際はそれぞれ1行です)

vsvars32-stlport.batにリネームして保存。

> "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32-stlport.bat"

ビルド。
> bjam --toolset=msvc stdlib=stlport --without-python install > build.log

build.logを見たら、
 ...updated 5631 targets...
でビルド成功。
01591512007/12/11(火) 14:43:59
■試しに動かしてみる。

stlport、boostともインクルード・ライブラリそれぞれのディレクトリ
を追加。

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
using namespace boost::filesystem;

boost::filesystem::path outputFilePath( "C:\\hogehoge.txt", native );
boost::filesystem::fstream outputFile( outputFilePath );

//string s;
//double d;
//s = "53.0";
//d = boost::lexical_cast< double >( s );

//cout << "Hello world" << endl;
//outputFile << "Hello world!" << endl;

return 0;
}

でビルド。

すると、>>151のようなエラー。

チラシの裏みたいでごめん。
01601512007/12/11(火) 14:46:34
↑にあるコメント行はゴミです。すまん。削除するのを忘れた。。
ビルドの要らないboostライブラリは普通に動きます。lexical_castとか。
0161デフォルトの名無しさん2007/12/11(火) 22:52:53
multi_index_container.hpp なんてのがあるのか orz
俺の一週間の苦労はなんだったんだ……
お前ら、先に教えてくれよ……

λ....トボトボ
0162デフォルトの名無しさん2007/12/12(水) 01:01:52
>>161
どんまい。。。
01631612007/12/12(水) 08:08:55
さすがにインデックス3つ使って複雑なコンテナ作ると,
Visual C++ 2008 でも IntelliSense が死ぬね.
でも補完機能は IntelliSense がぴか一だと思うんだけど,
それでも追い切れないとは…
0164デフォルトの名無しさん2007/12/12(水) 08:14:29
うーむ、2008はそんなにIntelliSenseがいいのか
2005Pro持ってるけどどうしようかなあ…
01651612007/12/12(水) 08:46:11
>>164
俺も自前で頑張って買った 2005 Professional 使ってたけど,
今は 2008 Express Edition 使ってます.

VC++ スレでは IntelliSense 糞とかいう書き込みを見かけるけど
マクロとテンプレートでの変態プレイにここまで対応してるのは
2005 レベルでもすげぇとおもう.

単に自分が Eclipse の設定をちゃんとしてないからかもしれません.
標準ライブラリまで指定してフルインデックスすれば
Eclipse の CDT でもちゃんと型追っかけてくれるんでしょうかね.
0166デフォルトの名無しさん2007/12/12(水) 11:03:02
ええ。
けど使い慣れたのを使うのが一番だと思います。
ちとスレ違いだしね。
0167デフォルトの名無しさん2007/12/12(水) 15:35:23
2008ってExpress出てるのかよ
0168デフォルトの名無しさん2007/12/12(水) 16:22:35
英語版だろ
0169デフォルトの名無しさん2007/12/12(水) 16:32:16
英語版でもいいよ
0170デフォルトの名無しさん2007/12/12(水) 19:51:46
以下のように、可変個引数(モドキ)をとる関数をtupleを使って作りたかったんですが、
行き詰まりました。関数内でtuple要素全てにアクセスする方法はありますか?
可変個引数が可能ならばtupleじゃなくても構いません。ちなみに、引数の型はすべて一緒です。

template<typename T>
void multi_args(const T& arg){

   for(int i = 0 ;i< tuples::length<T>::value ;++i){

     //tuple要素すべてにアクセスしたい
    //arg.get<i>() は当然だめ
   }

}

int main(){

   multi_args( make_tuple(1,2,3) );

   return 0;
}
0171デフォルトの名無しさん2007/12/12(水) 20:23:21
>>170
素朴な疑問なんだが、std::vectorじゃいけない特別な理由でも?
# まぁ、vectorだと即値を列挙することはできないわけだが。
0172デフォルトの名無しさん2007/12/12(水) 23:19:47
>>170
boost::fusionならfor_eachができるんだが
ループ内で全要素にアクセスってのは無理だな。
0173デフォルトの名無しさん2007/12/13(木) 08:02:53
boost fusion について日本語で解説したページってある?
0174デフォルトの名無しさん2007/12/13(木) 14:14:22
NiceBoost
0175デフォルトの名無しさん2007/12/13(木) 20:19:04
>>170
boost::assign::list_of
0176デフォルトの名無しさん2007/12/13(木) 23:31:39
>>170
tuple って単に car が get_head で、cdr が get_tail なので、
 tuple_for_each(t, f) { f(t.get_head()); tuple_for_each(t.get_tail(), f); }
tuple_for_each(null_type, f) {}
とかを作ってしまえばいい

で、なぜか iterator/zip_iterator.hpp の detail 内にあったりするわけだが
0177デフォルトの名無しさん2007/12/14(金) 07:11:53
boost::multi_index_container で
boost::multi_index_container::tag
を使うと Visual C++ 2008 ではエラーになる.
C1001 なので原因がよくわからない.
0178デフォルトの名無しさん2007/12/14(金) 10:41:48
bindとlanbdaを同時に使うとき
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using namespace boost;
using namespace boost::lambda;
とすると、_1 を使ったときコンパイルできなくなる。
boost::lambda::_1 なんてやるとコンパイルできる。
プレースホルダー _1 ってbind.hppでもlambda.hppでも
重複して定義されてる?
0179デフォルトの名無しさん2007/12/14(金) 10:46:27
俺、ファンクタの合成くらいにしか使わないので、
結局 boost::bind だけしか使わないようにした。
って、それじゃ根本的な解決になってないか。
0180デフォルトの名無しさん2007/12/14(金) 12:10:44
>>178
その通り
usingの代わりにnamespaceの短縮名を使うと良いと思う
0181デフォルトの名無しさん2007/12/14(金) 12:32:47
>>180
ありがとう。
で、namespaceの短縮名とは何ですか?
boost::lambda::_1のように常に明示的に
指定するということですか?
0182デフォルトの名無しさん2007/12/14(金) 12:35:49
>>181 namespace bl = boost::lambda;
0183デフォルトの名無しさん2007/12/14(金) 13:33:53
>>182
ありがとう。
別名を与えられることは知りませんでした。
これで対応していきます。
0184デフォルトの名無しさん2007/12/14(金) 15:48:19
bjamのv2の使い方が良く分からないんですが、例えば以下をv2で
書く場合、どのように書いたら良いんでしょうか?
#bjam -sTOOLS=mingw "-sBUILD=release <runtime-link>static <threading>multi <native-wchar_t>on" --prefix=/c/msys/1.0/local install
0185デフォルトの名無しさん2007/12/14(金) 17:59:08
libcgi とか libcgi++ とか libcurl の asio 利用版
なんてのもでてくるのかね?
0186デフォルトの名無しさん2007/12/14(金) 19:14:30
sregex r = sregex::compile( "A([1-9]*|[a-z]*)A" );
string str1 = "A123A AaaaA A3b3A A9A";

if( regex_search( str1, m, r ) )
{
...
}

で、
"123"
"aaa"
"3b3"
"9"
という文字列を取り出すにはどういう記述をすればいいでしょうか?
m[2].str() とか書いても、aaaとか取得できないんです。

sregexでなくxpressive利用でもいいです。

0187デフォルトの名無しさん2007/12/14(金) 19:35:19
const_iterator begin()const;
Effects: Returns a starting iterator that enumerates over all the marked sub-expression matches stored in *this.

const_iterator end()const;
Effects: Returns a terminating iterator that enumerates over all the marked sub-expression matches stored in *this.
0188デフォルトの名無しさん2007/12/14(金) 19:35:19
regex_searchじゃなくてregrex_iteratorでも使っとけ
0189デフォルトの名無しさん2007/12/16(日) 00:40:01
regex_searchで
最小マッチ?を指定するとダイアログ出て落ちるんです
0190デフォルトの名無しさん2007/12/16(日) 01:46:33
エスパー魔美
0191デフォルトの名無しさん2007/12/16(日) 20:10:54
http://pastebin.windy.cx/?page=view&id=1197803292
boost::serialization::base_object を経由せずに
(Base&) で型変換してシリアライズするのはダメ?
一応読み込むこともできているようなんだけど.

ちなみに (Base) で型変換するとスライシングのせいか
読み込んだ時に正しく読み込むことができません.
■ このスレッドは過去ログ倉庫に格納されています