07/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のようなエラー。
チラシの裏みたいでごめん。
160:151
07/12/11 14:46:34
↑にあるコメント行はゴミです。すまん。削除するのを忘れた。。
ビルドの要らないboostライブラリは普通に動きます。lexical_castとか。
161:デフォルトの名無しさん
07/12/11 22:52:53
multi_index_container.hpp なんてのがあるのか orz
俺の一週間の苦労はなんだったんだ……
お前ら、先に教えてくれよ……
λ....トボトボ
162:デフォルトの名無しさん
07/12/12 01:01:52
>>161
どんまい。。。
163:161
07/12/12 08:08:55
さすがにインデックス3つ使って複雑なコンテナ作ると,
Visual C++ 2008 でも IntelliSense が死ぬね.
でも補完機能は IntelliSense がぴか一だと思うんだけど,
それでも追い切れないとは…
164:デフォルトの名無しさん
07/12/12 08:14:29
うーむ、2008はそんなにIntelliSenseがいいのか
2005Pro持ってるけどどうしようかなあ…
165:161
07/12/12 08:46:11
>>164
俺も自前で頑張って買った 2005 Professional 使ってたけど,
今は 2008 Express Edition 使ってます.
VC++ スレでは IntelliSense 糞とかいう書き込みを見かけるけど
マクロとテンプレートでの変態プレイにここまで対応してるのは
2005 レベルでもすげぇとおもう.
単に自分が Eclipse の設定をちゃんとしてないからかもしれません.
標準ライブラリまで指定してフルインデックスすれば
Eclipse の CDT でもちゃんと型追っかけてくれるんでしょうかね.
166:デフォルトの名無しさん
07/12/12 11:03:02
ええ。
けど使い慣れたのを使うのが一番だと思います。
ちとスレ違いだしね。
167:デフォルトの名無しさん
07/12/12 15:35:23
2008ってExpress出てるのかよ
168:デフォルトの名無しさん
07/12/12 16:22:35
英語版だろ
169:デフォルトの名無しさん
07/12/12 16:32:16
英語版でもいいよ
170:デフォルトの名無しさん
07/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;
}
171:デフォルトの名無しさん
07/12/12 20:23:21
>>170
素朴な疑問なんだが、std::vectorじゃいけない特別な理由でも?
# まぁ、vectorだと即値を列挙することはできないわけだが。
172:デフォルトの名無しさん
07/12/12 23:19:47
>>170
boost::fusionならfor_eachができるんだが
ループ内で全要素にアクセスってのは無理だな。
173:デフォルトの名無しさん
07/12/13 08:02:53
boost fusion について日本語で解説したページってある?
174:デフォルトの名無しさん
07/12/13 14:14:22
NiceBoost
175:デフォルトの名無しさん
07/12/13 20:19:04
>>170
boost::assign::list_of
176:デフォルトの名無しさん
07/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 内にあったりするわけだが
177:デフォルトの名無しさん
07/12/14 07:11:53
boost::multi_index_container で
boost::multi_index_container::tag
を使うと Visual C++ 2008 ではエラーになる.
C1001 なので原因がよくわからない.
178:デフォルトの名無しさん
07/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でも
重複して定義されてる?
179:デフォルトの名無しさん
07/12/14 10:46:27
俺、ファンクタの合成くらいにしか使わないので、
結局 boost::bind だけしか使わないようにした。
って、それじゃ根本的な解決になってないか。
180:デフォルトの名無しさん
07/12/14 12:10:44
>>178
その通り
usingの代わりにnamespaceの短縮名を使うと良いと思う
181:デフォルトの名無しさん
07/12/14 12:32:47
>>180
ありがとう。
で、namespaceの短縮名とは何ですか?
boost::lambda::_1のように常に明示的に
指定するということですか?
182:デフォルトの名無しさん
07/12/14 12:35:49
>>181 namespace bl = boost::lambda;
183:デフォルトの名無しさん
07/12/14 13:33:53
>>182
ありがとう。
別名を与えられることは知りませんでした。
これで対応していきます。
184:デフォルトの名無しさん
07/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
185:デフォルトの名無しさん
07/12/14 17:59:08
libcgi とか libcgi++ とか libcurl の asio 利用版
なんてのもでてくるのかね?
186:デフォルトの名無しさん
07/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利用でもいいです。
187:デフォルトの名無しさん
07/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.
188:デフォルトの名無しさん
07/12/14 19:35:19
regex_searchじゃなくてregrex_iteratorでも使っとけ
189:デフォルトの名無しさん
07/12/16 00:40:01
regex_searchで
最小マッチ?を指定するとダイアログ出て落ちるんです
190:デフォルトの名無しさん
07/12/16 01:46:33
エスパー魔美
191:デフォルトの名無しさん
07/12/16 20:10:54
URLリンク(pastebin.windy.cx)
boost::serialization::base_object を経由せずに
(Base&) で型変換してシリアライズするのはダメ?
一応読み込むこともできているようなんだけど.
ちなみに (Base) で型変換するとスライシングのせいか
読み込んだ時に正しく読み込むことができません.
192:デフォルトの名無しさん
07/12/16 20:37:23
Resist the temptation to just cast *this to the base class.
This might seem to work but may fail to invoke code necessary
for proper serialization.
マニュアルにはこう書かれているけど,かといって private で
継承した基底クラスをシリアライズするためには >>191
みたいにしないとだめだよねぇ?
193:デフォルトの名無しさん
07/12/17 10:40:42
URLリンク(www.boost.org)
ここには基底クラス A の shared_ptr に派生クラス B のポインタを
持たせてシリアライズしています。なお、 A は仮想デストラクタを
持っています。このとき
boost::archive::text_oarchive oa(ofs);
oa.register_type(static_cast<B *>(NULL));
oa.register_type(
static_cast<
boost::detail::sp_counted_base_impl<
B *, boost::checked_deleter<B>
> *
のように register_type しなければならないようなのですが、
BOOST_CLASS_EXPORT マクロのようなもので登録できない
ものでしょうか? archive を生成してから毎回登録するのは
忘れてしまいがちなので。
194:193
07/12/17 11:14:31
というか、register_type で何を登録すればいいのかがわからん。
URLリンク(archives.free.net.ph)
でまさしく同じ問題についてQ&Aがあるんだけど、
結局上の URL の例をみろってことだけなんだよなぁ。
195:193
07/12/17 11:24:03
URLリンク(pastebin.windy.cx)
どうやらこれだけでいいみたい。
でも文字化けしてしまった…
#そのうち他言語対応しておきます。
196:193
07/12/17 11:25:44
他言語→多言語 orz
しかも sage てなかった orz-----3
197:デフォルトの名無しさん
07/12/17 16:56:24
Boost と POCO ってなかよしなの?
asio とか filesystem とかかぶってるみたいだけど.
198:デフォルトの名無しさん
07/12/18 13:34:06
VS 2008 EE 日本語版
199:デフォルトの名無しさん
07/12/18 18:06:51
class B{
public:
virtual void mf();
};
class D : public B
{
public:
void mf();
};
のように継承関係にあるクラスについて
shared_ptrはポリモルフィックに動作しますか?
つまり、
shared_ptr<B> bp(new D);
bp->mf() で D::mf() が呼ばれることはboostの仕様として
保障されてますか?
200:デフォルトの名無しさん
07/12/18 18:09:44
はい
201:デフォルトの名無しさん
07/12/18 18:12:42
thx
202:デフォルトの名無しさん
07/12/21 00:25:47
#include "stdafx.h"
#include <iostream>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
#include <vector>
#include <algorithm>
using namespace std;
namespace bl = boost::lambda;
int main()
{
unsigned int a[] = {0, 1, 1, 0, 1, 0, 0, 1};
for_each(a, a + sizeof(a)/sizeof(a[0]),
bl::if_(bl::_1 % 2 == 0) [cout << "偶数\n"].else_[ cout << "奇数\n"] );
}
これをコンパイルすると
private メンバ (クラス 'std::basic_ios<_Elem,_Traits>'
で宣言されている) にアクセスできません。
とエラーが出てコンパイルできません。原因は何でしょうか?
VC++ 2008 コンソールアプリケーションです。
203:202
07/12/21 00:44:29
自己解決しました。
204:デフォルトの名無しさん
07/12/21 00:54:37
わざわざ通知ありがとうございました。
205:デフォルトの名無しさん
07/12/21 12:42:34
boost::bind(&ClassA::MethodB, this, _1)
みたいなファンクタを生成するとき,ClassA に MethodB
が複数 (void MethodB(int) と void MethodB(double)とか)
定義されていたら,どちらのメンバ関数ポインタになるんでしょうか?
206:デフォルトの名無しさん
07/12/21 12:57:01
内輪で使うために作ったWindows版のバイナリパッケージを晒します.
ビルド環境
Visual Studio 2005 Professional SP1 日本語版
Visual C++ 2008 Express Edition 英語版
vc8 と vc9 でビルドするスクリプト
URLリンク(svn.windy.cx)
trunk の Windows 用インストーラつきバイナリパッケージ
C:\Program Files\boost\boost_1.35_20071202 以下に展開されます
アンインストールはディレクトリごと削除するだけ
ヘッダ(共通)
URLリンク(svn.windy.cx)
vc8用スタティック
URLリンク(svn.windy.cx)
vc8用DLL
URLリンク(svn.windy.cx)
vc9用スタティック
URLリンク(svn.windy.cx)
vc9用DLL
URLリンク(svn.windy.cx)
自分はスタティックライブラリしか使わないのでDLL版の動作は未検証.
GMP, MPFR, MPFR++ などのバイナリパッケージも.
URLリンク(svn.windy.cx)
207:205
07/12/21 13:06:06
パッケージは exe だけど,実体は自己展開 cab なので
拡張子を cab に変えればたいていのアーカイバで開けます.
あと,ランタイムに関してですが /MD と /MDd です.
208:206
07/12/21 13:06:56
名前欄間違えた.
209:デフォルトの名無しさん
07/12/21 18:17:17
>>205
static_cast<void (ClassA::*)(int)>(&ClassA::MethodB)
みたいに明示的にキャストしないと通らないと思った。
210:デフォルトの名無しさん
07/12/21 19:11:54
>>209
∩
( ⌒) ∩_ _
/,. ノ i .,,E)
./ /" / /" .
_n グッジョブ!! ./ /_、_ / ノ'
( l _、_ / / ,_ノ` )/ /_、_ グッジョブ!!
\ \ ( <_,` )( /( ,_ノ` ) n
ヽ___ ̄ ̄ ノ ヽ |  ̄ \ ( E)
/ / \ ヽフ / ヽ ヽ_//
VC9用をいただきました
211:210
07/12/21 19:13:04
間違えた
>>209 ×
>>206 ○
212:デフォルトの名無しさん
07/12/23 16:13:54
正規表現で調べる文字列にcharやwchar_tの配列は使用できないのでしょうか
213:デフォルトの名無しさん
07/12/23 17:06:19
>>212
char*やイテレータを取るバージョンがあるはずだが
214:デフォルトの名無しさん
07/12/23 18:15:20
>>213
以前のバージョンということですか?
できればxpressiveで書きたいので、最近のバージョンを使いたいのですが
それでは無理ってことでしょうか
215:デフォルトの名無しさん
07/12/23 18:34:45
バージョンと言うかオーバーロードな
と言うかリファレンス見たら?
216:デフォルトの名無しさん
07/12/23 22:54:20
>>215
つ 特殊化
217:デフォルトの名無しさん
07/12/23 23:22:28
つか入力にイテレータ取るバージョンがあれば当然ポインタ食わせられるだろ。
218:デフォルトの名無しさん
07/12/23 23:55:17
sregexがstd::string版なら、cregexがconst char*版。
Xpressiveでは、イテレータの型をテンプレート引数で指定する。
URLリンク(boost.org)
219:デフォルトの名無しさん
07/12/24 08:12:02
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::for_each(v.begin(), v.end(),
boost::bind(operator<<, std::cout, _1));
このようにして各要素を出力することはできないのでしょうか?
なぜだか error C2065: '<<' : undeclared identifier
と言われてコンパイルできません.
220:219
07/12/24 08:54:23
boost::bind に関するこのコードでなぜ最後のコメント部分の
コンパイルが通らないのでしょうか?
URLリンク(pastebin.windy.cx)
221:デフォルトの名無しさん
07/12/24 09:25:58
コンパイルできない理由はちょっとわからんけど、これじゃダメなん?
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout));
222:デフォルトの名無しさん
07/12/24 09:38:51
>>220
g++だと<unresolved overloaded function type>と言われたのでstatic_castしたら通った。
std::for_each(v.begin(), v.end(), boost::bind(
static_cast<A &(A::*)(int)>(&A::operator =),
&a,
_1));
223:デフォルトの名無しさん
07/12/24 09:43:23
>>219
intを出力するoperator <<は、cout (std::basic_ostream)のメンバ関数だから、
そのコードでは、正しいoperator <<へ辿り着けない。
もっとも、それ以前の問題でコンパイルエラーになっているようだが。
今回は221のいうとおりostream_iteratorもあるし、
その他演算子一般の場合は、bind使えなくてもlambdaがある。
224:219
07/12/24 09:48:19
>>221
いや,もちろんそれでやりたいこととしてはOKなんですが,
一般的な演算子を指定できれば応用範囲も広がるかなと思って.
>>222
VC9 だとテンプレートを検索しまくって
「あれでもない,これでもない」と C2780 を連発した揚句,
時々 ambiguous だというエラーも出るんですよ.
なるほど, g++ でもそのままでは通らなくて,
static_cast すれば通るんですね. operator() だと問題なくて
operator= だと問題になる理由がわからないですが.
既定の代入演算子が別途用意されてしまうからかなぁ.
自前で = をオーバーロードした時って既定の = は
定義されないんでしたっけ?
でも独自にコンストラクタを作ってもコピーコンストラクタは
勝手に作られていたような気がする.
225:219
07/12/24 09:51:05
>>223
なるほど,それで operator<< が見つからないと怒られてるんですね.
たぶんグローバル名前空間の operator<< を探しに行って「無い」
と怒ってるように思います.
自分はてっきりストリームの << 演算子はグローバル名前空間に
定義されていて必要なクラスに friend 指定されているのだと
思っていました.
226:デフォルトの名無しさん
07/12/24 11:35:14
>>224
boost::bindはlambdaと違って一旦メンバーポインタにするから。
だからoverloadされてるとまずい。