検索できなかったから素で立てたに1票。
スレタイ違いは正直致命的だと思うので
立て直しは仕方が無い気がする。
>boobs
確かにおっぱいは好きだが、タイポは嫌いだしいいんじゃね。
boostを全部ビルドしようと思って
bjam --toolset=msvc-9.0 release debug link=static,shared runtime-link=static,shared -sHAVE_ICU=1 -sICU_PATH="C:\Program Files\icu" --prefix="C:\Program Files\boost" install
ってしたけどダメだった.
runtime-link=static,shared
の部分をなくせばコンパイルが始まるんだけど,このオプション指定は外しても問題なし?
runtime-link=static,shared
こんな風に複数指定できるの?
おれはいつもこんな風に指定しているんだけど。
runtime-link=static runtime-link=shared
そもそもlinkとruntime-linkってどう違うの?
>>9 まったく別物。
linkは、スタティックリンク(lib)とダイナミックリンク(dll)をビルドするかどうか。
runtime-linkは、CRTのランタイムライブラリをスタティックリンクするか、ダイナミックリンクするかどうか。
例えばVCの場合、runtime-linkをsharedにした場合は、dllも一緒に配布しなければならない。
その場合配布しなければならないdllってMSVCRTのこと?
知らなかった
12 :
デフォルトの名無しさん:2008/04/15(火) 00:34:17
Asioはビルド不要と喜んでいたら、
Systemを使っていた/(^o^)\
チラシの裏!
1.35.0のdarwin.jam読んでユニバーサルバイナリをサクッとビルドする方法がやっとわかった
bjam --toolset=darwin architecture=combined address-model=32,64 link=static,shared release debug stage
toolset=darwin中?の更にオプションになってるのを、別オプションで--付くと勘違いしてたo..rz
ただこれでもfilesystemのdylibはエラー出るけどstaticは問題無さそう、たぶん。
15 :
デフォルトの名無しさん:2008/04/18(金) 02:14:33
boost::mt19937をつかってクラスを作ったのですが、これをつかうとコンパイル時に以下のワーニングが出ます。
ソースをみたのですが、、、よくわかりませんでした。どなたかワーニングが出る理由を教えてください。
class BMP {
public:
BMP(unsigned int seed=0) :
gen(static_cast<boost::mt19937::result_type>(seed)),
dst(0.0, 1.0),
rv(gen, dst) {}
double operator()() {
return rv();
}
private:
boost::mt19937 gen;
boost::normal_distribution<double> dst;
boost::variate_generator<boost::mt19937, boost::normal_distribution<double> > rv;
};
ワーニングの内容
sample.cpp:51: warning: 'bmp$rv$_dist$_r1' may be used uninitialized in this function
sample.cpp:51: warning: 'bmp$rv$_dist$_cached_rho' may be used uninitialized in this function
ちなみに51行目は、
BMP bmp;
となっていて、これをg++で-O3 -Wallでコンパイルするとワーニングが出ます。でも、-O3をとると出ません。
どうかよろしくお願いします。
-O3だと最適化のためにチェック項目が増えるから警告が出るんだな。
警告の内容を読めば判るとおり、初期化前に値を参照している怖れがある。
問題ないプログラムを書いているなら無視してOK。
17 :
デフォルトの名無しさん:2008/04/18(金) 22:39:28
>>16 ありがとう。問題ないプログラムだと思うので、とりあえずこのままでやっときます。
久々にSVN更新かけてみたら何かspirit関連一斉に変わった?
spirit.v2
v2になったのか!
目玉機能とかあるのかな?
良く見ていないが以前から計画のあったphoenix統合が実施されてるっぽい?
boost1.35 を VC++7.1 でビルドしようとしたら
LNK1104: コンパイラは、ファイル 'libboost_filesystem-vc71-sgd-1_35.lib' を開くことができません。
と出た.誰か助けて
インクルード方法は
#include "boost/filesystem/fstream.hpp"
で,VC++のオプションでインクルードファイルに
c:\..\boost
と設定しています
bjam使っとけば
今ごろは.libがboostに必要なの?
もしかして「今時は」と「この頃は」が混ざったか?
リンカオプションも知らずにboostをビルドですか
「今頃は」という言葉もあると思った
>>22 構成プロパティ>リンカ>全般>追加のライブラリディレクトリ
に(boostのディレクトリ)\libsを追加
そうすればVC++ではboostがオートリンクしてくれる
それはともかくスタティックリンクの仕方も分からず
ヘッダのインクルードと混同しているのにboostを使うのは無謀と思うんだが……
まあ並行して学んだ人もいるかもしれないけど
あと「boostをビルド」じゃなくて「boostを使ったプロジェクトをビルド」だろう。多分
>>27 boostビルドしなきゃライブラリができないじゃないか
29 :
27:2008/04/29(火) 18:54:50
あ、1.35はWindows用インストーラはまだないのか……
初心者がbjamなしでわざわざビルドするのはもっと無謀だろ……
30 :
22:2008/05/01(木) 08:36:22
すみません色々見直したんですが
bjam は boost-jam-3.1.16-1-ntx86.zip のものを boost1.35 を VC++7.1 を使用してboostをビルド
したつもりだったんですがやはりVCで「boostを使ったプロジェクト」のビルドが出来ません.
「ツール」→「オプション」→「プロジェクト」→「VC++ディレクトリ」で
インクルードディレクトリに C:\...\boost\bin.v2
ライブラリファイルディレクトリに C:\...\boost\stage\lib としています.
何がいけないのか自分だけではよくわかりません.どうかご教示いただけないでしょうか?
>>30 まずはそのlibファイルがあるか確認しよう。
bjamのオプションをちゃんと指定しないと
足りないライブラリがあるからねぇ。
1.34.1からオプションが変わってたので、
自分も何度かビルドし直しました。
35 :
22:2008/05/03(土) 00:37:26
>>31 確認したところ,-sgd- 付きの lib ファイルはありませんでした.
情けないことに指摘されるまでずっとあると思っていました.
>>34 シングルスレッド向けlibファイルを作るオプションコマンドを色々な形で実行してみても
fail update と出て -sgd- ファイルが作られることはありませんでした.
他にもboostの全てをビルドするしたという方と同じコマンドを実行してもやはりfail updateと出て生成されることはありませんでした.
>>33 var1.34.1インストーラを使い,var1.35 とは別に filesystem を生成し,プロジェクトもそれに合わせて設定しなおしたところプロジェクトのビルドはすんなりと通りました.
初めて boost を使うのでもう最新版であることにこだわらず var1.34.1 を使うことにしました.
解決せずに終わることにすっきりしないでもないですが,余裕もないのでこれで質問を終わります.
レスしてくれた方々,ありがとうございました.解決せずに〆ることになり申し訳ございません.
世の中にグラフ構造のデータは沢山あるけど
boost.graph
を活用している人いますか?
ちょっとしたデータなら自分で自前グラフデータ作ったほうがいいのか
その辺のしきいってどのあたりなんだろ
インストーラ版がわけ分からなくて,
Let's Boostの指示通りで成功した俺が来ましたよ.
Visual Studio 2005 ProのVC++への導入ができました.
boost_1_35_0.zipとboost-jam-3.1.16-1-ntx86.zipを入手し,
"%VS80COMNTOOLS%vsvars.bat" を実行し,
D:\Develop\boost_1_35_0\bjam.exe --toolset=msvc link=static,shared release debug stage
を実行しました.VSのパス設定は
インクルードファイル:D:\Develop\boost_1_35_0
ライブラリファイル:D:\Develop\boost_1_35_0\stage\lib
とし,C++ クックブック レシピ9.12のビルド・実行が成功しました.
補足要求とか,誤解指摘などあればどうぞ.
というかなんでいまさらになって、Boostのインストールの話ばかりなんだ。
インストールなんて難しくないだろ。
SVNからHEAD引っ張ってきてbjamでビルドするだけだろ。
使ってみようっ人がが増えたんだからいいじゃないか。
>>38 Win32環境だと使ってるコンパイラによって困ったりするのと
一番こまっちゃうのはVSのバージョン複数同時インストールしてるとワケワカメになる事だと思う。
unix系とりあえず自分の使ってるシステムでは問題でなかった。
いや、それほど困るか?
俺はstageディレクトリを作っているが、要するにVSのバージョンに合わせて、
stageディレクトリを複数用意すればいいだけの話だろ。
VSがひとつだけだとしても、32bitコードと64bitコードがあるが。
boost便利なんだけどバイナリサイズが凄い勢いで大きくなってくんだよなぁ
さっさとC++の標準になってもらいたいもんだな
というかlambdaが標準入りで大幅に書き直しを迫られるものが多いかと…
さらにtraits→concept。
どちらも下方互換性が失われるわけじゃないから、
boostに留まるならすぐに直す必要はないけど、
標準入りするには必須かと。
VCバージョン違いに加えてstlport使ってると更にややこしい
何とかビルドするのに1週間も掛かってしまったぜ
インストーラー出るのいつも遅いけど作るのそんな時間かかるもんかね?
最近のboostは
./configure
make
checkinstall (以前のバージョンだとここでこけた)
できるな。
>36
Boost Graph はグラフデータを表す方がメインじゃなくて、汎用的に使えるグラフ上のアルゴリズムの方がメインだと思う。
自前でグラフデータ作るなら Boost Graph に渡せるようにしとくと便利、みたいな。
ちょっとしたデータの方こそ adjacency_list とか使ってさくっと済ませて、速度なり機能なり必要な要件があるなら
それに適したデータを作るなり、アダプタ書くなりする方がいいんじゃないかと思う。
.hpp がきもちわるくて Boost つかってない
なんだよ Header++ って。ヘッダ仕様自体は変わってないつーのwwww
そうかそうか
中身がCなヘッダとC++なヘッダを区別したいお
と思ったことが一回ぐらいない?
.hpp って読むときどうしてもドットフププって読んじゃうんだよね。
>>49 でもこの分野、既存の用語の「反対の意味」とか「○○バージョン」を意味したいだけの造語、
結構多いでしょ。
ソフトウェアだって、単にハードウェアとの対比で生まれただけで、別に
ソフトウェアの何かがsoftだからそう呼ばれるようになったわけじゃないし。
そもそもBoostのヘッダの拡張子が.hだったとしても、
どうせ49は別の難癖付けてBoostを使わないと思う。
はっきりとBoost使ったコードはきもいから嫌だとか
正々堂々と言うほうがかえってすっきりした気分になれる、たぶんお互いに。
大体、拡張子が気に入らないから使わないとかおかしいだろw
標準ライブラリは拡張子が無いので使いませんw
hppって昔からあるような
hppもHもhhもhxxもh++も大昔から普通にあります。
ただ
>>49が誰かに構ってほしかっただけです。
気にしないで下さい。
うざ
.cxxって何だよw と思ったことならある
>>60 xx が ++ を英字で模倣したものだと気付くのに時間かかった。
Makefile とかは大文字で普通に使ってるから余計わかりにくい。
C++コードからしか使われないヘッダの拡張子は .h を使わないで欲しい
Cからも使えるヘッダなら .h でいいけど
boostベースの数値計算library
opentissue
が便利
CとC++の区別が付かない人がいるのか
そんな人がCとC++を使ったら「CっぽいC++」と「C++」を書くんだろうな
逆だろ。CとCっぽいC++じゃね。
ビャーンの本では .h を使ってるという理由だけで .h を使ってる。
boostのfaqに書いてある理由も理解できるので、別に .hpp に嫌悪感を抱くこともない
拡張子ネタとは関係ないけど、いくらビャーンの本で推奨されてもさすがにプログラミング環境でプロポーショナルフォントを使うのはナイ
そうか?
普通にプロポーショナルフォントを使っているが。
68 :
デフォルトの名無しさん:2008/05/13(火) 10:51:26
boost::formatに関する質問です。
Boost1.3.4.1を使用しているのですが、formatのparseメソッド(※)は使わない方がいいのでしょうか?
※宣言部分のコメントには「resets buffers and parse a new format string」とあり、コンストラクタでコールされています。
動作ですが、
boost::format fmt( "abcd %1$s" );
fmt % 1;
std::cout << fmt << std::endl;
fmt.parse( "efgh %1$s" );
fmt % 2;
std::cout << fmt << std::endl;
とすると出力が
abcd 1
2
となってしまいます。
69 :
デフォルトの名無しさん:2008/05/13(火) 10:52:22
(続き)
一応、
@.\boost\format\parsing.hpp の400行目(parseメソッドの最初)に
clear();
を追加。
A.\boost\format\format_implementation.hpp の行目(clearメソッドの最初)に
prefix_.resize(0);
を追加。
とすることで
abcd 1
efgh 2
と出力されるようになるのですが、この修正だけで問題ないのか心配です。
(ちなみに1.3.5.0のソースもDLして確認してみましたが、該当するような処理はありませんでした。)
まぁそもそもformatオブジェクトを使いまわしたところで大してパフォーマンス上がるわけではないんですがw
宜しく御願いします。
lambdaでPOD型扱うのに記述がめんどいんで
#define mem_of_1(Type, MemberName) (&_1->*&Type::MemberName)
#define mem_of_2(Type, MemberName) (&_2->*&Type::MemberName)
みたいにして使ってるんだが、こういうの標準でも定義してもらえないものか・・・
オレ定義だと可搬性に欠けるのが難点で。
>>64 何か線を引きたいようだけど C++ コンパイラで便利な C という位置づけもあるんじゃないか。
抽象化にこだわって変なソース書く人もいるわけだろ?
ようはスマートに処理をこなせるかということではないかな。
>>66-67 できればプロポーショナルフォントを使いたいが、
そこら辺のフォントだとプログラミングには使いづらい。
ピリオドやカンマ、セミコロンが小さすぎる。ゼロには斜線が欲しい。
どこかプログラマのためのプロポーショナルフォントなんて出してくれないものか。
>>70 boost-devel ML
にコード投稿したら
多分とりこんでもらえる
>>72 VC6とかに入ってるFONTEDITで自分で作ればいい。
90文字程度作ればあとはフォントリンクして終わりだから簡単だぞ。
76 :
75:2008/05/13(火) 18:32:39
ごめん、Win環境限定ならね。
プロポーショナルフォントでプログラムに困るようなうんこ環境は
Windows だけなので問題ない。
つまんね
>>71 CっぽくてもC++で作られたライブラリはCじゃ使えないから線引きは必要だ
#include <boost/array.hpp>
#include <boost/serialization/serialization.hpp>
struct S {
boost::array<int, 3> data;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, unsigned int ver) {
ar & data.c_array();
}
};
ttp://hw001.gate01.com/eggplant/tcf/cpp/boost_serialization.html#array ここを見て、boost::array.c_array()で生の配列を取り出してシリアライズしようと思ったのですが、
error C2679: 二項演算子 '&' : 型 'int *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
というエラーが出てしまいました。
どうやればシリアライズできますか?
ar & data.elems;でどうよ。
83 :
81:2008/05/20(火) 13:03:27
>>82 thx
コンパイル通りました。
データがpublicに置いてあるとは盲点でした。
連続で申し訳ないですが、もう1つ質問させて下さい。
Let's Boostで解説されているフルインストールをしたんですが、
ライブラリを必要とするboostを使ったものをビルドするとリンクエラーが出てしまいます。
例えば、
ttp://www.kmonos.net/alang/boost/classes/serialization.html このサンプルをビルドすると、
a.obj : error LNK2001: 外部シンボル ""protected: __thiscall boost::archive::basic_text_iprimitive<class std::basic_istream<char,struct std::char_traits<char> > >
::~basic_text_iprimitive<class std::basic_istream<char,struct std::char_traits<char> > >(void)"
(??1?$basic_text_iprimitive@V?$basic_istream@DU?$char_traits@D@std@@@std@@@archive@boost@@IAE@XZ)" は未解決です。
といったa.objでのerror LNK2001が7個(a.objはサンプルソースをコピペした.cpp)
libboost_serialization-vc80-mt-gd-1_34_1.lib(basic_serializer_map.obj) : error LNK2001: 外部シンボル ""__declspec(dllimport) public: __thiscall std::_Container_base::~_Container_base(void)"
(__imp_??1_Container_base@std@@QAE@XZ)" は未解決です。
といったlibboost_serialization-vc80-mt-gd-1_34_1.libでのerror LNK2001が12個出ます。
libboost_serialization-vc80-mt-gd-1_34_1.libでエラーが出るということは、
ライブラリへのパスが通ってないわけじゃないと思うんですが、原因はどこにあるのでしょうか?
CRTの設定(静的LIBかDLLか)が食い違っているとそんなエラーが出た気がする。
VC2008でビルドするためのパッチを当てる必要があるかもしれない気がする。
86 :
83:2008/05/21(水) 08:34:22
>>84 いろいろ変えてみたら、/MTでlibboost_serialization-vc80-mt-gd-1_34_1.libでのエラーが消えましたが、
a.objでのエラー7個が残ったままです。
>>85 すみません、詳しくお願いします。
環境はVC2008EEです(書き忘れてましたすみません)。
>>80 たしか設定済みmeadowに入ってたよね
meadowとVisual Studio組み合わせられると便利なんだけどね
89 :
83:2008/05/21(水) 14:38:36
>>89 おそらくVC8の設定でライブラリをビルドしてしまっているから
VC9EEの設定で構築しなおす必要がある。
そのURLに載っているファイル4つを編集してbjam --toolset=msvc-9.0すればいい。
>ファイルの末尾に追加
差分の見方がわからないならdiff unifiedでぐぐれ
つーか1_35_0使えばいいんじゃないのか?
91 :
83:2008/05/21(水) 21:10:39
>>90 1_35_0を入れたら、すんなりビルドできました。
最新版を確認するべきだったorz
ありがとうございました。
BGLを使い始めたのですが、adjacency_listについて質問があります。
adjacent_vertices()は、adjacency_iteratorのpairを返すのですが、
このイテレータはSTLのRandomAccessIterator要件を満たすと
ドキュメントに書いてあるのですが、以下のコードのように
イテレータに加算すると、コンパイルが通りません。
これは、私のコードに問題があるのでしょうか?
// VertexProp, EdgePropは適当に定義
typedef adjacency_list<setS, vecS, undirectedS,
VertexProp, EdgeProp> Graph;
Graph G;
// Gに頂点やエッジを追加してグラフを作成
// vはGの1頂点で、隣接する頂点は複数個存在
tie(ai, ae) = adjacent_vertices(v, G);
vertex(*(ai+1), G); // コンパイルエラー
ちなみに、環境は以下の通りです。
boost: 1.34.1
コンパイラ: GCC 4.2.3
>このイテレータはSTLのRandomAccessIterator要件を満たす
どこに書いてあります?
OutEdgeList を setS で設定しているので,
RandomAccessIterator の要件は満たさないと思いますよ.
>>93 http://www.boost.org/doc/libs/1_35_0/libs/graph/doc/adjacency_iterator.html のMEMBERS OFの項に、
The adjacency iterator type implements the member functions and
operators required of the Random Access Iterator concept, except
that the reference type is the same as the value_type so operator*()
returns by-value.
と記述があるのです。この説明はadjacency_iterator_generator::typeに
ついてのものだと思っていたのですが、勘違いでしょうか?
もう一度ドキュメントを読み返してみたら、MODEL OFの項に
The adjacency iterator adaptor (the type adjacency_iterator_generator<...>::type)
is a model of Multi-Pass Input Iterator .
と記述されていました。これならば、operator+()が定義されていなくても
当然なのですが、ちょっと混乱しています。
>>94 adjacency iterator adaptor は out edge iterator を adapt して
operator* の動作を edge の target を返す動作に書き換えるだけだと思います.
なのでそのドキュメントは間違っているのではないかと思います.
adjacency iterator adaptor はベースになっている out edge iterator が
-Multi-Pass Input Iterator なら Multi-Pass Input Iterator
-Forward Iterator なら Forward Iterator
-(ry
という具合に,単にベースの out edge iterator が
どの concept の model かを投影するだけ,というのが正しいのではないかと.
96 :
95:2008/05/25(日) 10:14:21
>>94 それから adjacency_list の adjacency_iterator は
別に adjacency_iterator_adaptor で実装されているとは限らないので,
読むべきドキュメントは adjacency_iterator_adaptor のドキュメントではなくて
あくまで adjacency_list のドキュメントかと思います.
ただ, adjacency_list において adjacency_iterator と out_edge_iterator が
どの iterator concept のモデルなのかの関係については,
↑の議論が踏襲されるのが自然とは思います.
そして現に, Adjacency List のドキュメント
http://www.boost.org/doc/libs/1_35_0/libs/graph/doc/adjacency_list.html では, "The adjacency_iterator models the same iterator concept as out_edge_iterator. " と
書いてあります.
97 :
95:2008/05/25(日) 10:20:15
なので結論としては,
>>92 で adjacency_list の OutEdgeList テンプレートパラメタに setS を指定しているので,
out_edge_iterator は Bidirectional Iterator concept のモデルになり,
従って adjacency_iterator も Bidirectional Iterator concept のモデルなので,
>>92 のランダムアクセスではコンパイルが通らないのだと思います.
98 :
92:2008/05/25(日) 13:45:24
詳細にわたって解説していただきありがとうございます。おっしゃる通り、
まずadjacency_listの解説をよく読むべきでした。
OutEdgeListにsetSを使っているのは、エッジの重複を許したくないと
いうのが理由でした。グラフを読み込む際にエッジの重複をチェック
するようにして、OutEdgeListにはRandomAccessIteratorにするように
すればいいのかとも思いますが、そうするとエッジに対する各操作の
時間複雑度も変わってきてしまい、なかなか悩みどころですね。
よく考えてアルゴリズムを実装します。
なんか最近の.NETの中身見てると、Boostが隠ぺいされてそうな雰囲気がするな
時代がBoostに追い付いてきたって事か
VC++2008EEでboostを使ってみようとboost_1_35_0_setup.exeを使ってインストールしました。
しかし実際に使ってみると「定義されていない識別子です。」と言うエラーが出てコンパイル出来ません。
パスが通っていないのかと思い、以下のように通してみましたが駄目でした。
インストールしたライブラリのタイプ(?)はマルチスレッドとマルチスレッドデバックのみです。
実行ファイルパス…C:\Program Files\boost\boost_1_35_0\bin
インクルードファイル…C:\Program Files\boost\boost_1_35_0
ライブラリファイル…C:\Program Files\boost\boost_1_35_0\lib
問題が起きる最小限のソースコードplz
エラーメッセージくらい貼ろうよ
104 :
101:2008/06/01(日) 23:00:03
すみません、boost::の付け忘れが原因でしたorz
微妙にすれ違いだけど、Lokiってあんまり使われてないのかな。
先駆的なライブラリで、(in "Modern C++ Design")
あれの機能は他に取り込まれているから。
おお!そうなんだ。取り込まれ先はBoost?
今日初めてBoostを導入してSVNからのビルドも一応出来たんだけど、
Bjam+MSVC9でビルドに数時間掛かる。
コマンドプロンプトを見ると、暫く止まって・急に動いての繰り返しでCPUメータを見ても殆ど動いてない。
CPUを100%使い切って構わないのでさっさとビルドを済ませるオプションはありませんか?
HDDがボトルネックという可能性は?
ボトルネックというより不調発生してトライ&エラー多発してるんでは?
HDDはAHCI接続のWD7500AAKSで、空き容量も110GB程度あります。
CPUはCore2Quad 3GHz、メモリは8GBです。
トライ&エラーというとコマンドプロンプトはWarningの嵐ですが、どこかミスしているのでしょうか。
ビルドオプションは
bjam --toolset=msvc -a link=static,shared threading=multi release debug stage
ビルド環境はVS2008EE SP1beta+Windows SDK 6.0.6001.18000.367です。
試しに今もう一度ビルドしていますが、20時32分に最初のライブラリが出来て
21時24分の時点で出来上がったライブラリ数は21、21時36分現在は49です。
>>111 core2Quad 2,4G 2Gbyteだけど全然かからなかったなあ。
今bin.v2とstageタイムスタンプ見たら10分ぐらいしか幅がない。
CPUメータ上がらないのは変だね。ウイルス対策ソフトとか遅くないか?
Event Viewerを見てもそれらしきエラーはありません。
VS2008EEをGUIで立ち上げて他のプロジェクトをビルドするときは4コアを100%使い切って
数分で終わるのですが・・・。22時53分現在のビルド数は102個、大量のWarningはC4819(ソースの文字コード絡み?)です。
動作的にはC4819大量発生→20~30秒程沈黙の繰り返しで、HDDへのアクセスは常に続いていますが動作が散発的です。
セキュリティ関係はVista標準のFirewallのみでDefenderは切ってあります。
Boostの本題と関係無い話でスレを潰すのもあまり好ましくないと思いますので、
似た事例が無いかネット上を探してみます。
ビルド終わりました。
214ファイルで4時間15分・・・orz
SVNクライアントの設定が変なんじゃね
逐一リポジトリの最新版チェックしてるとか
set CL=/wd4819
環境変数CLに登録しておくと文字コードの警告表示されなくてすむよ
それより警告の原因をどうにかしたほうが良いんじゃないかな。
文字が化けてそれ以降のコードが滅茶苦茶になってた事があったから。
ビルド時の標準出力はファイルにリダイレクトしとかない?
grepしないと不安だよね。
>>119 それsvnで直接拾ってきたソース?
もしそうならsvnで落とすときに言語設定が日本語になっていて日付が日本語表記になったせいだと思う
>>122 ソースはsvnからTortoiseSVNで落としてきて、tools/bjamフォルダ内のbuild_dist.batで組んだbjamで
ビルドしてます。
言語環境は日本語Vista SP1に英語パックを入れた状態ですが、
日本語の文字化けの関係でシステムロケールは日本語にしています。
今見たら日付のフォーマットはLong dateが漢字を使っていたので英語にしました。
次回のビルドで検証してみます。
日付と時刻のフォーマットを英語にしてソースを全て落とし直してからビルドしたところ、
/wd4819を設定しなくてもC4819の発生が激減しました。
ビルドも24分で完了しました。有難うございます。
珍しく有益な情報だな
やっぱり結論が書いてあるとよい
質問主も回答者も乙
そういえばドイツ人の書いたコードにドイツ語コメントあってコンパイルこけたことあったな
CじゃなくてPythonだが、スクリプトがエラーを吐くので調べてみたらauthor欄に"◆"が入ってた。
即座に空欄にした。
あの時ほど、死ね2chねらと思ったことはない。
boostは確かlexical_castとかのauthorがASCII以外の文字を使ってたような気がするぞ、
Boost.Threadに
event
timer
に相当するものがないのはなぜ?
スレッドその物じゃない。
力作を送れば採用してもらえるかも?
そういえばboostに日本人作のものって入ってるの?
boost::conditionとかじゃないのか?
133 :
デフォルトの名無しさん:2008/06/11(水) 16:03:34
boost.rubyができれば強制的に入ることになるかも
>>131 boost::rangeの一部(MFCコンテナ用range)は日本人っぽい名前だったような。
あとこないだまでレビューしてたboost::eggも多分そう。
「C++なぞ問題外」と書いたまつもと氏のRubyがboostに入るわけですか
boostは心が広いなぁ、ホント素敵!
いいえ、RubyをベースにしたRuby++言語の処理系をboostベースで実装します
boost なぞ問題外.^^;;;
どうでも良いが個人的にまつもと氏に0xに改善されても尚C++が問題外かどうかを訊ねたい。
boostのtime関係って
ってなんであんなにごちゃごちゃしてるの?
boost::date_time
boost::x_time
boost::system_time
C++のtime関係がごちゃごちゃしてるからだよ。
SVNはasioが頻繁にアップデートされているな。
そのうちDirectSoundと同じ位気軽にASIOを扱える様になるんだろうか。
って、ソース見たらASIO関係無い・・・
穴があったら入りたい
全くのスレ違いだがPortAudioをオススメしておく
ありがとう
146 :
デフォルトの名無しさん:2008/06/12(木) 06:56:32
>>139 悪いものに何を付け足しても良くならないと考えるんじゃない?
Ruby より優れた言語はこの世に存在しない。
スクリプト言語と普通の(?)言語を一緒にされても・・・
Rubyでブートローダーとかデバイスドライバとかゲームとか作れるのかよ。
boostはpythonをサポートしてるから、boostスレでわめいてもRubyの布教に効果ないよ。
空飛ぶパイソンvsキリスト
boostがrubyに対応させる?
rubyがboostに対応させる?
まー、Java(笑)なんかよりは優秀だろ
Rubyは
Java言語がいかに貧弱だろうとJVMが優秀だからJavaが有利
最近じゃscalaとかあるしなぁ
Fortran「」←帰れと退けたくなる様な事言わせろ
>>157 あなた様がいなければ、CやC++といった素晴らしい言語は生まれませんでした
Boost.Malbolgeマダー?
Fortran「全部大文字で書いてくれ。俺の名前も」(1977)
Boost.XML
Boost.SOAP
Boost.CORBA
誰か作ってケロ
Boost.XMLはspiritにxml用の設定があったような?
xml_iarchive xml_oarchive
boost.rails
しかもMPL使いまくりなのを
BOOST_AUTOは完全にC++に準拠していて尚且つ拡張の無い環境ではちゃんとコンパイルされるの?
それでできたら C++0x の auto の追加はいらないんじゃないか?
でも auto ほど簡単な記述はできないか。
コンパイラのバグをうまくついて実装してたりするんじゃなかったっけ?
>BOOST_AUTOは完全なコンパイラの元では規定型の自動変数の宣言をラップしたものになる。
>規定型とはC言語時代のint
ここ5年はMicrosoftべったりのC++プログラミングの仕事だったんだけど標準に近いC++に戻ってきました。
特にテンプレート周りの環境変化は浦島状態なんですが、なにかお勧めの書籍ないですか?
細かいところはWebでしか追いかけられないのは承知ですが、まとまった内容は書籍の方が体系的に吸収できると思うので。
リハビリでModern C++ Designは読みましたが、今となってはあれも古い本だよねぇ。
LokiはBoostに吸収されてしまってるのかな?
日本語のboost本は殆ど初心者向け。君が得られるものは何もない。
以上からお勧めの書籍は存在しないという結論に至る。
まあ導入くらいが目的なら、そこらに落ちてるboost本なら何でも。
boost本って稲葉の以外に出てるの?
>>171 Boostスレだけど、C++一般なんだよね?
「C++ Coding Standards−101のルール、ガイドライン、ベストプラクティス」
これが今のところ網羅的な本。初心者にもルール集としては便利だけど、
内容は中級以上じゃないと理解できない。
>>171 つ Beyond the C++ Standard Library: An Introduction to Boost
つ The Boost Graph Library: User Guide and Reference Manual
日本語は俺も稲葉著以外ないでしょ
>>169 C++ Template Metaprogramming
テンプレートっていうかBoostのTMPの本だがリハビリには丁度良いかと
174 :
173:2008/06/16(月) 09:50:28
間違えた
-日本語は俺も稲葉著以外ないでしょ
+日本語は俺も稲葉著以外知らない
稲葉のも糞とは言わんが内容的に半端だからなぁ
みなさん、いろいろ書籍紹介どうもありがと。
とりあえず上がってるやつで日本語のものから優先で読んでみまつね。楽しみです。
ところですれ違いならごめんなさい。
実装環境ですが、WindowsとUnixの両方で動くようなプログラム作成を想定してて
現時点でなるべく新しいものをということで、WindowsはVC9(2008)、UnixはGCCの使用を考えてます。
ここでBoostは、1種類しか実装版がないようなので迷う必要がないですが
STLは、STLPortがいいのでしょうか。それともVC・GCCにはじめから添付されてる(?)やつを使うのが普通ですか?
たぶん性能と導入容易性とでみなさん天秤にかけておられるのと思いますが…。
LokiはTypelistなどMeta Programming関連が非常に興味深かったですが、
有用なものはBoostに包含されていて、とりあえずBoost使ってればOKな感じですか?
ぐぐるとLoki自体はバグがそれなりにとかあったので、仕事には使いづらいのかなとも…。
ちょっと空気が読みきれてなくて、初歩的な質問すまそです。
両方のOSで動かしたいだけなら、Cygwin入れてgcc使えばいいのに。
・Lokiはもはや必要ない
・Boostの前にTR1
・g++は最新のものを附属のlibstdc++と一緒に
・VC++は「必ず」最新のものを、必要になった時にSTLportと
・暇があればConceptGCCも試す
フェニックスシングルトンってLoki以外の他のそれ以外のBoost以外を除いたものの中にサポートされてたっけ?
Boost.Singleton って定期的にレビューに現れては reject されてるな
boost.spiritって何がspiritなの?
ふざけてるの?
すいません、boostを巻き込むとコンパイルにえらい時が掛かるんですが、こんなもんなの?
つプリコンパイルドヘッダ
>>182 俺も高性能なPCが欲しくて仕方がない。
>>182 boost使い始めるとコンパイルが見る見る遅くなるんで笑った。
テンプレートを実体化するものをヘッダーに置くとすさまじく遅くなるようだ。BOOST_CLASS_EXPORTとか遅いね。cppで実体化させる様にすると速くなる。
xpressiveを使ったときのコンパイルの遅さとmapファイルの肥大化には思わず笑ったな
VSの簡易リビルドが正確だったら、この機能を使ってコンパイル時間を短縮できるのに。
boost.pythonちょっと試そうと思ったんだけど
単なるhello, worldにも異常にコンパイル時間かかるから断念した
これならSWIGやpyrexみたいなの使ったほうがいい
ターンアラウンド遅すぎるしコンパイラのエラーメッセージは不可解だから、
学習やおためしには不向きだな
俺みたいなヘタレは、デバッガつかってもboostのコードは追いきれる自信ねえよ
難解なマクロとテンプレートのコンビ技の嵐だし
boost::ptr_vector が内部に持っているポインタ配列の先頭アドレスを取得する
メソッドはあるでしょうか?
&V[0]とか?
ptr_vector の operator[] はポインタが参照するオブジェクトへの参照なので
配列のアドレス情報は含まれないはずです。
どういう間隔で配列が内部にあるかという情報はないの?
たぶん内部では boost::ptr_vector<T> pv の中には std::vector<T*> v のようなものが含まれていて
template<class T> T& ptr_vector<T>::operator[]( size_type pos ) { return *v[pos]; }
のような実装になっていると思う。
実際に欲しいアドレスは &v[0] だけど、&pv[0] とすると v[0] を得てしまう。
ptr_vectorの定義見ればいいんじゃね?
マクロばっかの追いにくいコードだったと思う
Boostに動的ライブラリのラッパーが追加される予定はありますか?
GLibのGModuleみたいな。
>>197 おお、こんなのがあったんですか。ありがとうございました。
boostにMATLABでいう多次元配列のようなものあるでしょうか?
multi_arrayを試してみたのですがA+Bといった処理ができなくて・・・
matrixだと2次元行列しか対応してないのでしょか?
boost::formatを使って、数字を右寄せで表示しようと思ったのですが、やり方が分かりません。
0で穴埋めしか方法はないのでしょうか?
>>201 printfと同じ書式指定でできると思うけど、それじゃ不足?
std::cout << boost::format("%8d") % 42 << std::endl;
みたいな感じ
>>188 swigを試してみてboost.pythonの偉大さに気がつくだろう
c++とpython組み合わせるならこれかctypes以外の選択はありえない
swigが動くのはtoy problemだけ
>>199 同じ疑問を前にもったことあるけど、前に探したときはいいのなかった
>>203 そうかな。
boost.pythonのチュートリアルの最初の例である
"hello, world"を返すだけの関数なんだが、char*をwchar_t*に
変えてみただけで、長いコンパイル時間の末に、糞長く意味不明な
コンパイルエラーの列に遭遇した。
俺はchar*→PyStringに対応するwchar*→PyUnicodeの自然なマッピングが当然
存在するだろうと想像したが、実際にはそうではなかったわけだ。
ヘッダを潜ってみて、どうやらwstringならイケることが分かったけれども
こんなことはやってられないな、と思ったよ。
コンパイルエラーってそれ自分がミスしたんだろ。
wstringで変換できるならやればいいだろ。
いみがわからん。
つーかwstringなら通るんだ? どう見てもpythonのUnicode文字列とは等価じゃないのに。
>>206 その「ミス」がわかるまで遅すぎる(時間がかかる)上に、
エラーメッセージがhuman readableでないから、原因を特定するのに
異常に時間がかかると言ってるんだよ
だいたい、char*やwstringはイケてwchar_t*はダメなんてデザインは
一貫性も糞も無いし、そんなの予想できないよ
>>207 うん。通ったよ。
Pythonからインポートして、unicode文字列が得られることも確認した。
ほんとだ、wstringは双方向で通るくせにwchar_t*は通さねぇw
まぁ確かに他にもドキュメントの読み辛さとかembeddingの弱さとか色々発展途上の感じは否めないが、
そこだけを叩いて使えねぇとするのはいささか不公平だろうよ。
objectからattrで名前を取り出してそのままoperator()で関数が呼べる便利さとか
extract<>で大体のデータ型は上手いこと取り出せたりする所とかをもっと評価してやるべきだと思う。
>>211 うん、凄そうなのは分かってるんだよ
ただ、いざとなったらヘッダ読み込む気合が無いととてもついていけない世界だなと
改めて感じたってことさ
trivialなhello, worldの例でUnicodeが使えるかどうかを確かめるのに
俺がどんだけ時間かけたと思う?
ま、そういうパワーがある人は羨ましいっつーことで
嫉妬乙、とでも思ってくれ
213 :
201:2008/06/20(金) 21:38:13
>>202 thx
printfほとんど使ってこなくて、知らなかった・・
ゼロサプレスって言った方が賢く見えるよ^^v
boost.pythonが複雑ならctypes使えばいいじゃない
swigはとにかくありえない
boostから引用されているC++0xって英語版VSには追加パッケージでくるって聞いたけど
日本語VSにはこないの?
そりゃβの話だろ。SP1に含まれるよ
あらほんと?
VS2008買っちゃおうかしら...
VS2008ほどSP1が待ち遠しいVSはないな
俺はMFC目的だが
C++0xの為に新しいPCをバイトをして買わなければ・・・
でもプログラミングする時間が・・・
boost mpl について質問があります
template<typename TL /* boost::mpl::vector */ >
class foo
{
typedef boost::mpl::at<TL,0> T0; T0 _f0;
typedef boost::mpl::at<TL,1> T1; T1 _f1;
...
typedef boost::mpl::at<TL,n> Tn; Tn _fn;
};
みたいなのを任意の長さのvectorについて自動的に生成するには
どうすればよいのでしょうか
BOOST_PP_REPEAT等では案の定上手くいきませんでした
ご教示ください
BOOST_PP_REPEATで何が駄目なのかよく分からない。
マクロレベルじゃなくてTMPレベルで自動生成したいって事か?
ならBOOST_PP_REPEATで予め256通りの特殊化を作っておく必要がある。
223 :
221:2008/06/26(木) 08:31:47
#define GEN(z,n,d) ...
template<typename TL>
class foo
{
typedef boost::mpl::size<TL> Size;
BOOST_PP_REPEAT(Size::value, GEN, data);
}
で怒られたわけです。
Size::value の代わりにリテラルにすると展開してくれます
PPの処理順序の問題化と
224 :
221:2008/06/26(木) 08:44:23
エディタのマクロに働いてもらうことにします
template<typename TL> class foo;
BOOST_PP_REPEAT(256, asdf, nil)
#define asdf(z, i, nil) BOOST_PP_REPEAT(i, zxcv, nil)
#define zxcv(z, i, nil) \
template< BOOST_PP_REPEAT(i, qwer, nil) > \
struct foo< mpl::vector< BOOST_PP_REPEAT(i, sdfg, nil) > >{ BOOST_PP_REPEAT(i, xcbv, nil) };
#define qwer(z, i, nil) BOOST_PP_COMMA_IF(i) typename type_ ## i
#define sdfg(z, i, nil) BOOST_PP_COMMA_IF(i) type_ ## i
#define xcbv(z, i, nil) typedef type_ ## i T ## i; T ## i _f ## i;
こうか。
キモいというか読み辛い。
コンパイラには通してないから適当に間違ってる所があったら修正してくれ。
227 :
221:2008/06/26(木) 08:58:53
>>225 ありがとうございます
正気にては大業成らずって感じですねw
後でゆっくり解読させてもらいます
何故デフォルト引数を使わない
229 :
デフォルトの名無しさん:2008/06/27(金) 10:46:38
Windows、VC++2008、boost 1.34.1です。
VC2008の対応はここを参考にしてます。
http://www.02.246.ne.jp/~torutk/cxx/vc/vcpp90.html boost::iostreams::zlib_compressorを使いたいのですがリンカでlibboost_zlib-vc90-*-1_34_1.libがないと怒られます。
そこでこんな感じでlibboost_zlib-vc90-*-1_34_1.libのビルドを試みたのですが…。
set NO_COMPRESSION=0
set NO_ZLIB=0
set ZLIB_SOURCE=C:\hoge\boost\zlib\src
bjam --prefix="C:\hoge\boost\boost_1_34_1" --toolset=msvc-9.0 -f zlib.jam
"-sBUILD=release debug <threading>single/multi <runtime-link>static/dynamic"
こんなエラーが出てダメでした。
zlib.jam:90: in module scope
rule cond unknown in module
どうやればlibboost_zlib-vc90-*-1_34_1.libを作れるのでしょうか?
boostの重さに耐えられない→結局自作
VC2008では1.35.1使えってな結論が以前出てなかったっけ
SVNの話題ですが、バージョンが今日付で1.36に移行しました。
興味がおありでしたらVC2008用ライブラリ一式をどこかに上げますが如何致しましょう。
むしろビルド方法を書いて啓蒙してくれ
新規ので気になるのはとりあえずexception
ほんとだ、1.36になってるな。
>>236 ビルド方法なんて散々既出だとおもうが。
1.36の新機能のレビューお願いします
申し訳ございません、プログラミング自体が先日始めたばかりで
Boostはビルドしているだけで未だ利用迄手が回っていない状態でございます・・・
さっき1.35入れたばかりだけど今から1.36入れよう。
>>239 サンクス
次からテンプレに入れたいなこれ
お早うございます。
朝起きてSVNを更新してみたらFixが大量に為されていたので、svn46798をビルドして上げておきました。
ttp://booster.x0.to ドメインbooster.x0.toは一時公開用に取っただけだったのですが、
割と需要があるみたいですのでこのまま維持して週一位の間隔でSVNをビルドして上げていこうかと思います。
svnのどこに1.36って書いてあるよ? って思ったらversion.hppが変わったってことなのね。
> Googleがお前らを気狂い認定w
C++ユーザーなんて認定上等! だろうなぁw
ただのコーディングルールだろ
笑いどころを教えてくれ
>Some Boost libraries encourage coding practices which can hamper readability,
>such as metaprogramming and other advanced template techniques,
>and an excessively "functional" style of programming.
フヒヒw
>Currently, only boost/compressed_pair.hpp is permitted.
何故にcompressed pairだけ許可されているんだろう。
>>251 続きの文章をコピペしないのは公平とはいえないな。
>We are actively considering adding other Boost features to the list, so this rule may be relaxed in the future.
我々は他のBoost機能をリストに加えることを活発に考えているので、この規則は将来緩和されるかもしれません。
それより
We do not use C++ exceptions.
We do not use Run Time Type Information (RTTI).
ってどうよ
kernelやDBMSのエンジンみたいなのがexception投げまくりコードなんて
想像するだけでもぞっとしないし、至極妥当だと思うけど
なんか問題あったら適当に諦めて試合終了していいオモチャじゃなきゃ
そこらは慎重にならざるを得ないんじゃないの
・・・。
>>252 いや、それはどうでもいいんだ。
何で現時点で、compressed pairだけ許可されているのか気になるんだ。
あれってそんなに使い勝手がいいものじゃないだろ?
>>253 Googleにとって大抵のエラーは例外的なエラーではないんじゃない?
基本的に奴らは多数のコンピュータでスケールさせりゃいいって考えだし、
ハードの故障なんてしょっちゅうだし。
dynamic_castとかtypeidとかは、普通使う必要はないだろ。
ユニットテストには使っていいって書いてあるし。
実際デバッグぐらいに使うのが妥当だろ。
ん?なんかおかしいこと言ったか?
Joel Spolskyも例外嫌いと言ってたけど
大体googleと同じ理由だったな
C++にはRAIIのようなテクニックはあるけど、彼らは非常に多くの顧客を
相手にしていて信頼性や性能の要求水準が非常に高いから、
例外を使いつつ、同時に要求される信頼性や性能を達成するってのが、
結局割に合わないってだけなんだよ
>>254 それ例外の使い方間違ってないか?
例外安全意識して書いてれば
> なんか問題あったら適当に諦めて試合終了
なんてことにはならないんだが。
例外が嫌われる理由はなんなの?
万一拾い忘れたとき(コード人為的ミス)
(1) 例外の場合 : プログラム停止
(2) エラー値返しの場合 : エラー無視
で、デフォルトとしては(2)の方がまだましということかな?
だとすればRAIIとは関係ない論点ということになる?
>>259 (1) のほうがマシと考える人も相当数いるとおもうから、それは理由には
ならないんじゃないか?
・例外使う派(既存のコードや人)と使わない派を組み合わせるとマズイ。
・例外安全という新しい概念が前面に押し出されていて面倒。
こんなところかと。
後者はエラーコードでも同じ話が出てくるはずなんだけどな。なぜか
例外に限った話だという迷信(?)が根強い。
例外が嫌われる理由としてはソースの可読性が下がるってのがあるけどな。
可読性は上がるだろう。フローは追いにくくなるかも知れんが。
>>259 その程度のレベルの話はgoogle的には問題にもなっていない。
RAIIはあくまで「リソースリークを避けられる」だけだ。
RAIIさえ使ってれば例外安全、と思ってるならそれは違う、と言わざるを得ない。
例えば何か複雑なデータ構造を更新している最中に例外を投げられても
それで諦めて試合終了してはいけないプログラムであるような場合に、
真にコードが真に「例外安全」であることを保障するためのコストが、
例外により儲かるbenefitと全く釣り合ってないって話だろ。
>>263 例外使わなければエラー発生時の安全性を保証するのが簡単になるの?
>>264 Joelが書いているが、極端な話、非常にクリティカルな場所では
例外安全性を保障するために一文ごとにtry .. catchを使うことになる。
それは恐ろしく冗長で醜い。
それぐらいなら、古きよきエラーハンドリングのほうがまだマシだって話だろ。
一行ごとにって、いったい何の例外をキャッチしたいんだ?例外の使い方間違ってないか?
まさか、URL文字列の解読なんかじゃないよね?
検証箇所は減るよね
>>266 googleやJoelに言えよ。
カーネルがinodeやbtree更新してる最中に放り投げてファイルシステム
ぶっこわれたら困るだろ?
無論、i++;みたいな例外を投げないことが分かっているコードなら別だが、
関数呼び出しのようなものを含む場合は、それが例外を直接ないし間接に
投げないことを保障するにはcall treeを全部たどるしかない。
つまり、そのコードが例外安全かどうか、「正しい」コードかどうかを
判断するのが読み手にとってずっと困難になる。
言っておくが、皆が皆例外を使うべきじゃないなんて俺は一言も言ってないぞ。
奴らの要求水準にとってはそれが妥当なコーディングルールなのだろうと
言ってるだけだ。
>>268 例外処理で吹き飛ぶファイルシステムって、停電でも吹き飛びそうで怖いな。
しかし、なぜに例外を禁止するかの具体的な理由は後学のために知りたいもんだけど。
だから、googleの理由ならちゃんと書いてあるんだから読めよ
googleではJavaは禁止ね
>>272 C++、Java、PythonがGoogleの公用語だったはず。
JavaはSUNと共同開発だかなんだかする位。
Pythonは作者を雇っちゃってる。
公用語ワロタ
例外使うと、後片付けとか、その他の終了処理が面倒になる可能性があるのと、
不具合対処のデバッグが極端に難しくなるのが、原因だと思う。
少なくともWindowsだと落ちてくれる方が、不具合対処はよっぽど楽だし。
>>275 1行目は、終了処理はデストラクタで。
2行目は、なんだろう?
3行目は、落ちてくれるほうがいいなら例外マジおすすめ。
ってことで、2行目詳しく。
>>276 mainでcatchしてると、例外の箇所でデバッガがブレークしてくれないよー。なんてことじゃないことを祈る
C++の例外が敬遠され勝ちなのは、
後付けでまだまだうまくライブラリ群に融合してないからでしょう。
例外機構そのものには問題はない。
> カーネルがinodeやbtree更新してる最中に放り投げてファイルシステム
> ぶっこわれたら困るだろ?
例外を全く理解してない。30年くらい前の頭。
>>269 しつこく食い下がる割に、ビッグネームの言い分に立ち向かうことには及び腰で
あくまで「ここの連中の言葉」だけ相手にしたがるお前にワラタ。
30年前は例外投げたらファイルシステムぶっ壊れたの?
英語がよめないのでビッグネームの言い分がわかりません
解説お願いします
283 :
275:2008/06/30(月) 01:14:22
>>276 3行目の"落ちる"は例外処理してプロセス終了させる意味ではなくて、
アプリケーションエラー(メモリ参照エラー等)で落ちるの意味。
で、2行目と3行目は大体同じ意味。Windows前提だけど、例外処理を捕捉して
ログ吐かせるのに手間ヒマかけるよりか、自動起動のデバッガのスタックトレースを
追っかけた方が対処が早いし確実。
tryブロック内でnewしたオブジェクトの後片付けは、finallyとかあったら楽なのかも。
>>277 昔、ネストしたクラスで例外処理していた時に、子クラスから親クラスへ順々に
catch (ex) ⇒ throw ex していたら、どこで異常処理になっているのか
さっぱり分からなくなった記憶が…。例外処理のセオリー(デザインパターン?)
みたいなものってあるんでしょか?
>>278 例外機構事態に問題がある、とかいう話じゃねえよ。
問題があってもきちんとロールバックやリカバリを行って動作し続けなければ
ならないような、間違ってもデータ構造更新中に中途半端な状態で放置
してはならないような種類のプログラムで、例外機構を使って信頼性のあるコードを
書くのが難しいし、そのコードの例外安全性を保障することは、さらに難しいって
話だろ。
勿論、エラーを送出し得る全てのコード(関数呼び出し)を逐一try/catchで囲めば
意味的には例外を使わず全ての関数呼び出しの戻り値をチェックするのと同じだ。
が、そんなことをやるコードは、単に戻り値をチェックしてエラー処理をする
コードよりも汚く冗長で、その上無用なオーバーヘッドを抱えることになる。
つまり、ちっとも嬉しくないだろ。例外使っても。
>>283 VCのデバッガ場合ハンドルされている例外はブレークしないのがデフォ設定になってる。
デバッガの例外の設定でブレークがかかるようにできる。
>>283 > 自動起動のデバッガのスタックトレースを
構造化例外を捕捉して起動してますが…
初期化子も理解してないお子様なのでは?
288 :
283:2008/06/30(月) 01:50:07
初級脱却用テキスト、Accelerated C++でも読んでくれ。
>>284 うんうん、これよくわかった。どうもありがとう。
想定エラーケースのうち :
ちまちま細かいリカバー継続処理(数ステップ程度)が求められるケースが多いプログラムの場合
-> 返り血方式の方が書くのが楽
(場合によってはブロックも越えて)どかんと飛ぶようなスキップ・再試行が求められるケースが多いプログラムの場合
-> 例外方式の方が書くのが(相当)楽
ということね。
まあ、みんなもそうだろうけど、ちまちまとどかんの両方あることわかってて、
例外方式だけで統一するか、返り血方式だけで統一するか、設計時に岐路に立たされるよね。
余談だが、実は例外使うのなかなかハードル高いよね。
別の人も書いてたけど、両方式まぜまぜが一番イクナイというか怖い、のだが、
既存ライブラリやAPIは返り血方式をとってるのが多かったりするという第一の壁。
あと例外は拾い損ねが一番恐ろしいわけなのだけど
JAVAのように独占的な1製作者が例外クラスを統一的に設計してくれてればcatchもしやすいんだが、
MSでいえば、標準ライブラリ・MS COMラッパー・MFCなど例外乱立しててぷぎゃー。第二の壁。
デザパタとかでどうにかなる問題なのだろうか。
>>290 しまった、名前のほうに番号書くべきだったみたいだな
>>247Googleで例外禁止な理由読んでみた。
例外を送出するかもしれないコードを、
例外使ってないコードから利用するのは難しいからだってさ。
んで、Googleにはすでに例外を使ってないコードがたくさんあるから、
そこから新しいコードを使うことを考えると、例外は使えないと。
スクラッチから始められるなら例外使うかもしれんらしい。
要するにgoogleはC++98より古いC++のコードが既に多量にあると
リファクタリングする気もないわけですな
まぁ、お前が要すればそうなるんだろうな。
295 :
259:2008/06/30(月) 07:19:00
>>292 横着して原文読まずスレだけ読んでたんだが、適切な説明ありがとん。
ビッグネームの言い分に立ち向かうとか、んな大袈裟な話でもなかったわけな。
初期化子を理解していればお子様から抜けられるのか?
>>284 > 問題があってもきちんとロールバックやリカバリを行って動作し続けなければ
> ならないような、間違ってもデータ構造更新中に中途半端な状態で放置
> してはならないような種類のプログラムで、例外機構を使って信頼性のあるコードを
> 書くのが難しいし、そのコードの例外安全性を保障することは、さらに難しいって
> 話だろ。
これの理由がわからん。なんで信頼性が変わるんだ?
例外安全性の保証についても、戻り値を使う派はエラー安全性の問題を無視して
「ほら簡単でしょ」と言っているだけのような気がする。ほんとに戻り値使ってエラー安全な
コード書いた上で比べてるのか?酷いもんだぞ。
関与できない原因によって発生した例外と
プログラムが関与できる原因によって発生した例外とがごちゃ混ぜになってるから信頼性が変わるって話だろ。
>>298 プログラムが関与できる・できないの区別が具体的にどんなものかわからない。
それもあって当然、それらが混ざってると信頼性が変わる理由がわからない。
もうすこし詳しい説明希望。
>>296 例外処理の記述が恐ろしいほどシンプルになる。
301 :
デフォルトの名無しさん:2008/06/30(月) 09:14:38
>>292 古いコードから新しいコードを使いにくいからか。
変な理由だな。
インターフェースが変ったら、例外があろうがなかろうが、
新しいライブラリに置き換えるのは大変なはずだけどなw
単純に考えて、CからC++のコードを呼び出す場面があるからじゃね?
>>292位しか理由がないよな。
例外だとだめで返値ならOKって、んなバカな話はない。
Joelが言ってるのだって、例外を知らないバカ対策でしかない。
Joelが「例外を知らない馬鹿対策」なんて低レベルな話を
してるとでも思ってるのかw
少なくともお前よりは優秀な人間しかJoelの周りにはいないだろうよ
>>305 バカ対策ではない理由を挙げてくれよ。ソース付きで。
毛荒れスミス対策
ハゲてないよ
compressed_pair のみ使用してもよい理由は書いてないね。
2要素のタプルは使用頻度が高い&データ数が数百億単位になる
Google では1要素あたり1バイトでも節約したいとかそんな感じだろうか?
別のエントリで shared_ptr を使おうとかいってんのになあ
>>305はJoelが何者かも知らないで言ってる。
>>305 Googleは社内の馬鹿対策してる会社だよ。
http://labs.google.com/papers/mapreduce.html > This allows programmers without any experience with parallel and
> distributed systems to easily utilize the resources of a large
> distributed system.
本文や関連資料を読んでいただくとより明確に分かるが、
雇われも含めて社内のプログラマを対象とした話。
いまさらググってきた成果を、
>>305は得意げに晒した。
しかし、悲しいかな彼は英語を読めなかった。
それが、自らの主張を真っ向から否定する証拠そのものだと言うことを、
彼は理解出来なかったのだ。
>>257 > Joel Spolskyも例外嫌いと言ってたけど
> 大体googleと同じ理由だったな
そもそもジョエル・スポルスキーはそんなこと言ってたのかという
挙げ足取りが過ぎるか。。。
プログラム板ってIDないから、どいつがどいつなのかわかんないのが不便。
VisualC++でboost::uBLASが動かないんですけど何か対策はありますか?
どんだけ少ない情報で質問しているのやら。
ここにエスパーはいませんよ。
しかも初心者スレに誤爆してるしな
VC++のバージョンが分からん上に
エラーの内容すら無いんじゃ答えようも無いな
分からないなら黙っててください
うん、まぁそれでもいいんだけど、
「このままじゃ全員黙ったままだよ」
っていうのを、急に親切に教えてあげたくなってねw
VC++のバージョンは8.0です。
対策が無いなら良いんです。
>>316 それじゃ、おいらがとっておきと対策を伝授しよう。
諦めろ。
受動的問題解決策は対策とは言わない。
そういえばおかしなやりとりが増えた気がするな。
人間のクズめ。
クズ同士仲良くしろや。
くだらんことにレスを13(おれ含め)も使いおって
モノの聞き方を考えてから投稿しろ
別にh抜かなくていいだろw
BOOST_PP_SEQ_ELEMの仕組みがわかりません。
どうして BOOST_PP_SEQ_ELEM_X seq の形を最終的に x, _ にできるのかわかりません。
335 :
デフォルトの名無しさん:2008/07/12(土) 21:33:24
boost::asio::iostreamの内部で使っているソケットにTCP_NODELAYオプションを与えて、
Nagleをオフにしたいのですが、どうやればいいのでしょうか?
>>333 boost/preprocessor/seq/elem.hpp は見た?
順番に追っていけばいいんじゃないかと。
例えば、X=2 で seq=(x)(y)(z) とすると、
BOOST_PP_SEQ_ELEM_2(x)(y)(z)
BOOST_PP_SEQ_ELEM_1(y)(z)
BOOST_PP_SEQ_ELEM_0(z)
z, BOOST_PP_NIL
のように、X が一つ減るごとに seq が消費されていって、あとは
BOOST_PP_SEQ_ELEM_III(z, BOOST_PP_NIL) → z BOOST_PP_EMPTY()
BOOST_PP_SEQ_ELEM_IV(z BOOST_PP_EMPTY()) → z
という感じかと。
取り出す要素が最後尾じゃない場合、後ろに残った要素はどうなるんですk
>>337 この辺微妙にコンパイラ依存で分岐してるけど、
最終的には (x, _) → x みたいなやつの _ にマッチして捨てられる。
MSVC のやつだと、X=0 なら
BOOST_PP_SEQ_ELEM_III(x, BOOST_PP_NIL(y)(z)) → x
やっぱりコンパイラ依存で綺麗には実装されてないか。
test
341 :
デフォルトの名無しさん:2008/07/17(木) 22:41:12
おお、やっと書き込めた。
ublas::vectorで、3次元ベクトルしか代入できない型って作れない?
rangeのsize関数ですけど、rangeとしてvectorを扱う想定で作って、
万が一、listが渡されてしまったらコンパイルエラーにならず、危険じゃないですか?
344 :
デフォルトの名無しさん:2008/07/18(金) 16:06:34
いみがわからない
>>343 実際やってみるとコンパイルエラーになるよ。
そのためのイテレータの分類じゃね
BOOST_PP_REPEATをネストしても自動的に深さを知って適切に取り扱ってくれる理由が、ソースを読んでもまったく分からないのですが。
一体どうやって実装しているんでしょう。
auto_rec.hppというのが謎すぎる。
349 :
343:2008/07/19(土) 02:06:41
>>344-346 どもです。
size関数の実装をみたら、end-beginが0以上かどうかのエラーチェックしかなかったので、listが渡されたら?と思ったのですが、
operator-でエラーが出るのですね。
いつも乙です
Boost foreachの一種で
↓のような動作をしてくれる奴はないかしら
for(int i=0;i<max;++i)
for(int j=i+1;j<max;++j)
func(x[i],x[j]);
>>352 そんな無駄なコードを使って何をさせたいのか詳しく。
一瞬わからなかったけど、よく見ると確かに無駄すぎるw
func(x[i], y[j])なんだよきっと
ん? (i, j) の組について foreach をするってことじゃないの?
それともこのやり方ってありえないくらい無駄なの?
内側のループが外側のループ制御変数に依存するし、同じ配列の二箇所を引き数にしか取れないし。
ごく普通の配列演算を、なんでそんなに不思議に思っているのかわからんし、
>>352は既に自分の欲しい物を
>>352で得ていると思うのだが…
>>352 全域とかのように意味のある範囲指定ならあらかじめループを用意できるだろうけどそれ以外は自分でforを書くのが妥当でしょうね。
その2重のループを用意したいならそのループの意味が必要になると思う。たとえば全組み合わせをループさせるnCmやnPmやnPAImとかあるといいかも。
>>358 線形代数もろくに知らない人が結構多いんじゃないの?
using namespace boost::assign;
std::vector<std::string> v;
v += "a", "b";
boost::format fmt("%s%s");
std::for_each(v.begin(), v.end(), (boost::ref(fmt) % boost::lambda::_1));
は直感的に正しいようにみえるけどコンパイルが通らない。
\boost\boost_1_35_0\boost\lambda\detail\operator_lambda_func_base.hpp(210) :
error C2664:
'boost::lambda::detail::return_type_deduction_failure<<unnamed-symbol>>::return_type_deduction_failure(const boost::lambda::detail::return_type_deduction_failure<<unnamed-symbol>> &)' :
1 番目の引数を 'boost::basic_format<Ch>' から 'const boost::lambda::detail::return_type_deduction_failure<<unnamed-symbol>> &' に変換できません。
回避策などありませんでしょうか?
環境はVC8です。
> 直感的に正しいようにみえる
MAJIDE?
std::for_each(v.begin(), v.end(), boost::lambda::ret<boost::format>(boost::ref(fmt) % boost::lambda::_1));
361です。
どうやらfor_eachが第三引数の関数の戻り値を求めるので、ラムダ式の戻り値を明示的
に指定せねばならなかったようです。
using namespace boost::assign;
std::vector<std::string> v;
v += "a", "b";
boost::format fmt("%s%s");
std::for_each(v.begin(), v.end(),
boost::lambda::ret<boost::format&>(boost::ref(fmt) % boost::lambda::_1));
それでは。
boost::asio::ip::tcp::iostreamでデータを受信したいんですけど、winsockのrecvみたいに
バッファのサイズを指定して実際に読み込んだ数を返す、の様な関数はないんでしょうか?
あるいは、
boost::asio::ip::tcp::iostream s;
//...
s.seekg(0, std::fstream::end);
std::streamsize size = s.tellg(); s.seekg(0);
みたいにしたあとに
s.readをして一気に読み込んでも仕様上正常なんでしょうか?
>>366 istream に readsome() という関数があるようだが、違うかな?
>>368 VS2008 がある今、さらに boost::asio の話と関係あるの?
VS2008は諸事情により使えないんです。
boost::asio::ip::tcp::iostreamとistream::readsomeは関係があります。
>>366 asio::streambufへソケットのread_someで読み込んで、
そのstreambufでistreamを構築するって形はどうか?
>>366 boost::asio使ったこともねえくせのに口を挟むけど
要するに既に読み取り可能なデータがあれば、それだけを読んで返すような、
read(2)のようなセマンティクスで動くようなものが欲しいってこと?
iostreamはブロッキング/バッファリングI/Oのセマンティクスのライブラリだから、
それは無いんじゃねえの?
stdioにもそのような物はないしな(fread()は指定したバイト数に達するまで
いくらブロックしようが何度でもread()して粘るし、fgets()もそうだ)。
逆に言うと、まさにそういう動作が欲しいときにstdioやiostreamを使うわけで、
ネットワークプログラミングでもっと低レベルなものが欲しければ、
そんなもの使わねえだろ。
素直にもっと下の、basic_socketだか何だか知らんが、その辺を叩いたらどうだ。
それと、seekable deviceでもないものをあいてにseek()するのは流石に論外だぞ。
>>372 > stdioにもそのような物はないしな(fread()は指定したバイト数に達するまで
> いくらブロックしようが何度でもread()して粘るし、fgets()もそうだ)。
つ setvbuf(3)
>>373 setvbuf()でバッファリングは確かになくせるが、fread()が何度でも
read()しようとすうのはかわらんよ。
while ((n = read(fileno(stdin), buff, sizeof buff)) > 0)
write(fileno(stdout), buff, n);
のようなループは、ttyで動かした場合に、一行入れるたびに一行echo back
してくるだろ。
fread(), fwrite()を使った場合、たとえsetvbuf()で_IONBFにしたところで、
指定したバッファサイズが埋まるまでは読み込みを繰り返そうとするから、
そういう動きにはならないよ。
ISO的にはバッファリングするかどうか分からない。(処理系定義)
だからバッファリングすると仮定して書かなければならない。
もちろんバッファリングされない可能性も仮定する必要がある。
>>375 え?streambuf::pubsetbuf()はれっきとした標準でしょ。
ただ、
>>374にも書いたけど、バッファリングを切ることと、
istream::read()なりistream::readsome()なりが
Unixのread(2)のような動きをするかどうかは全く別の問題であって、
「read(2)を高々1回しか呼ばない」などという実装依存極まり無いことは
とうぜん仮定できないよな。
istream::read()やfread()に関しては、エラーにならない限りは指定したバイト数を
読もうとするのは*仕様*だから、read(2)とは動きが違うのは当然だ。
istream::readsome()に関しては、どういう動きをするかは、ぶっちゃけ
かなり実装依存なんじゃないか。
VC++2005のは少なくとも壊れてるんだろ?
バッファリングをどのように行うかは処理系定義。
バッファを設定する関数はあるんだけど。CもC++も。
Cの方は「意図」が説明してあるんだけど、
意図に沿うかどうかは処理系定義と明記されている。
つまりバッファリングの意味が定義されてない。
>>377 なるほど。何食わぬ顔をしてスルーしてもいいってことか?w
そういえば俺が以前試したとき、gccがopen済みのstreamのpubsetbuf()を
平気な顔で無視していたんで、cinやcoutのバッファリング設定を変える方法が
無かった。今はその辺は変わってるんだろうか。
D言語でのImplicitConversionTargetsみたいなやつってある?
ある型を与えると、その型から暗黙変換可能な型のタイプリストを返すメタ関数なんだが
boost::xpressiveで、マッチした部分列を取り出すにはどうすれば良いんでしょうか?
また、それが複数ある場合はどういう記法がなされるのでしょうか?
groupみたいなのが
#include <iostream>
#include <string>
#include <boost/xpressive/xpressive.hpp>
namespace bx = boost::xpressive;
int main()
{
bx::smatch what;
bx::sregex re = bx::sregex::compile("(..)(..)");
std::string s = "foobar";
if (bx::regex_search(s, what, re)) {
std::cout << "$0=" << what[0] << std::endl;
std::cout << "$1=" << what[1] << std::endl;
std::cout << "$2=" << what[2] << std::endl;
}
}
こんなもんじゃねえの
詳しいことはドキュメントに載ってるはずだから、自分で読んどけよ
ありがとうございます。死んでも死にきれません。
ここ2年ぐらいのboostで変わった点を把握したい
以前に良く使ってたのは数値計算とメタ制御関係で
ublas
MPL
lambda
bind
accumulator
mult_array
gil
関連しそうなので新しく出て有用そうなlibraryって何かありますでしょうか?
compressed_pair
progress_bar
fusion
multi_index
asio(Asynchronous I/O)
iostreams
serialization
range
390 :
デフォルトの名無しさん:2008/07/26(土) 08:46:20
これなに?
391 :
デフォルトの名無しさん:2008/07/26(土) 08:50:13
自分でビルドすりゃあいい。
393 :
デフォルトの名無しさん:2008/07/26(土) 10:48:47
やっぱ外人がホームページやってる方が信頼性がありそう
そうかね
そうだね
そうだろうか
自分が使うコンパイラでビルドするのがいろいろ楽じゃね?
自分でビルドするのは電気代の無駄だよ。
同じコンパイラ用のバイナリが既に配布されてればそっちを使った方がいい。
テンプレートバリバリのboost使ってプログラミングするのは電気d(ry
400 :
デフォルトの名無しさん:2008/07/26(土) 14:55:42
boost、STLは生産性が高まるからで近代安い
boostをビルドする電気代なんてケチってもジュース一本も飲めやしない
電気代を節約するならC++を使うべき
環境にやさしいプログラマー
embedded C++のことですねわかります
そういえばコンパイルが爆速なのが売りの言語があったな。 なんだっけ、デルフ……おやこんな時間に誰か来たようだ
boost::asioのhost_nameがクライアントホスト名ではなくて別の文字列を返すんですが、
クライアントホスト名を得るにはどうすればいいんでしょうか。
デルフリンガーですね、わかります。
よお相棒
デスブリンガーと空目した
boost::asioでバイナリプロトコルでやりとりするサンプルありませんか?
httpやftpのサンプルしか見つからないので・・・
バイナリプロトコルで具体的に何をしたいのか
>>410 Cっぽく書くと下のような感じです。
uint8_t buf[32];
*(uint16_t *)&buf[0] = command;
*(uint16_t *)&buf[2] = len;
*(uint32_t *)&buf[4] = param1;
send(s, buf, 8);
recv(s, buf, 32);
command = *(uint16_t *)&buf[0];
...
boost::asio::streambuf.data()あたりからuint8_t *が取り出せるかと
思ったけど取り出せなかったので適当なサンプルがほしいと思ったわけです。
つーかstreambufインタフェース使えるんなら別にboost::asio関係ねくねーか?
iostream/streambufでバイナリ入出力をやる方法はわかってるの?
>>411 streambufがあるなら、そこからistream/ostreamを構築して、
istream/ostreamのメンバのread/writeを使ったらどう?
read/writeはstdioでいうところのfread/fwrite相当のバイナリ読み書きのメンバ関数。
たぶん、streambufだとsgetn/sputnがそれにあたるんだと思うんだけど
使ったことないから自信ないんだ、すまん。
>>414 > streambufだとsgetn/sputnがそれにあたるんだと思うんだけど
それで合ってる。
ただ、void*じゃなくてchar*ベースなので、要reinterpret_cast
iostreamのread()やwrite()も同じだね。
416 :
デフォルトの名無しさん:2008/08/08(金) 15:54:16
質問です。
VS2008
Boost1.35(インストーラでインストール)
の環境で、Boost::serializeを使ってみようと思ったのですが
#include <boost/serialization/serialization.hpp>
の一行をクラスヘッダに組み込むだけで、
シリアル化のコードを実装しなくても(クラス定義側・ユーザ関数側共)
以下のようなエラーが出てしまいます。
1>c:\program files\boost\boost_1_35_0\boost\serialization\utility.hpp(48)
: error C2143: 構文エラー : ',' が '<' の前にありません。
1> c:\program files\boost\boost_1_35_0\boost\serialization\utility.hpp(50)
: コンパイルされたクラスの テンプレート のインスタンス化
'boost::serialization::is_bitwise_serializable<std::pair<_Ty1,_Ty2>>'
の参照を確認してください
これは何が悪いんでしょうか?
ライブラリの中からエラーを吐かれたので正直途方にくれています。
>>416 #includeはネームスペースの外だよね?
とりあえず>417のver1.36に差し替えたらクリアできたようです。
ありがとうございます。
>418
グローバル名前空間でincludeしてます。
ちなみに、 map<int, classOb*> みたいな感じのコンテナで
ポインタの先のオブジェクトの実体まできちんとシリアライズできるかを確かめたかったのですが
ちょっとコード書いてみた限りでは問題無さそうです。
ただ、なんか足元が不安定な気がして怖いですが。
テキスト出力・バイナリ出力はできたけどxmlだとコンパイルエラーを吐くとか。
xml使わないから別にいいけど
>>419 xmlはmake_nvpに<や>を使うとエラーになるね。そんでテンプレートを派生元にしたときにBOOST_SERIALIZATION_BASE_OBJECT_NVPを使うと思わず引っかかってしまう。
質問です。
http://www.boostpro.com/products/free で boost_1_35_0 を自動ビルドしたものを Microsoft Visual C++ 2008 に
「インクルードファイル」
「ライブラリファイル」
として登録しています。
で、いろいろとboost関係のポップアップが出るのですが・・・・・・形が違う orz
例:本家のページやboostについていた解説htmlだと「boost::regex」
となっているものが、vcのポップアップだと「boost::RegEx」
また、本家に書いてあるものがポップアップには表示されず、本家の通りに書いて
ビルドすると「そんなものは無い!」と叱られます。
どこをどう間違えたのか・・・。
>>422 あ・・・ソースと言われて気づいたことが。
もしや
#include <boost/regex.h>
と
#include <boost/regex.hpp>
の差?
ソース見たら#include <boost/regex.h>でした。
今、#include <boost/regex.hpp>に変えたらポップアップの中身が変わりました。
・・・・・・・・・・・・・・('A`)小文字のregexがありました。
>>423 失礼。これは間違い。
「実行可能ファイル」 の登録が原因。
おさわがせしました。
すみません。
冷静に登録の違いと「.hpp」「.h」の違いを一つずついじってみました。
どうも
>>423のほうが正解かと。
クオータニオンをマトリックスに変換したり、マトリックスの逆行列を求めたり
マトリックスやベクトルをくクオータニオンで回転する機能ってある?
いま一つ算術系の使い勝手が分からない・・・orz
巨大な(100x100とかの)行列用途ならboost::uBLAS。 クォータニオンは多分ないけど。
そうでないなら大人しくDirect3DXとか自作のライブラリとか使っとけ。
その辺の所のスタンダードは俺もちょっと欲しいと思っているが、
CPU依存の最適化方法が色々あるからちょっと難しいのかもね。
#include <boost/math/quaternion.hpp>
取りあえずベクトルやマトリックスについていろいろベンチとってD3DXと比べてみるわ
あんまり環境依存のライブラリ使いたくないんだけどな
レスサンクス
boostにあれば便利なんだけど、3次元くらいまでのベクトルだったら自分で作るの可だし。
自分で作ると効率悪いだろ?いろんな意味で
四元数は3x3行列に特化したものだし、応用が限られてるからな。
三次元の回転の処理には非常に便利だが。
その3x3だけ対応でいいから作ってほしい
後3次元ベクトルの回転も
そのくらいの実装だったら自分で出来るかな・・・いや無理ですorz
クオータニオン→行列
とか
クオータニオンでベクトルを回転
とかググればすぐに見つかるだろw
ていうか
>>429 で出てるけど四元数そのものはあるよ
それのマトリックスやベクトルとの連携の話をしてるんだが
実装自体はできるだろうけど高速化は無理です
自分で作ると効率悪いだろ?いろんな意味で
クォータニオンを使う前にまずジンバルロックでハマるのが通過儀礼
自分でやりたいんじゃなきゃ、出来る技量がなければ、
boostじゃなくてG3Dとか使えばいいんじゃないの?
行列の内部表現とかベクトルにマトリクス掛ける方向とか
描画ライブラリごとに違うからな。
もし作るにしても filesystem とか thread みたいになるんじゃね?
443 :
デフォルトの名無しさん:2008/08/13(水) 09:25:42
boost::anyに固定配列入れたいんですけどどうしたらいいですか?
コンパイルエラーになります
'any::holder<ValueType>::any::holder<ValueType>::held' : クラス、構造体、共用体のメンバは、初期化できません。
そこでboost::arrayですよ
anyは本当になんでも入れられるわけじゃないぞ。
>A ValueType is CopyConstructible [20.1.3].
>A ValueType is optionally Assignable [23.1]. The strong exception-safety guarantee is required for all forms of assignment.
まあ、たぶんこのようにするしかないだろ。
class Foo
{
int bar[10] ;
} ;
>>445 おっしゃるとおりですね。ありがとう。
>>444 boost::arrayで実装しました。ありがとう。
ここ一週間位SVNの更新規模がガクンと減っていたから、正式リリースの前触れかなと思っていたが
当たりだったみたいだね。
もう1.36.0出るのか。
こないだ1.35.0入れたばっかだってのに
boost::testのsync_access_testがどいつもこいつもfailureなのが気になるのぅ
おおお来たか
まだ、ダウンロード数が0だな。
みんなトップからリンクされるの待ってるのかな?
トップからリンクされるまで、のんびりと何が変わったか確認するかな。
何がバージョンアップされたんだろう。
またビルドするの面倒臭いな。あれ俺の低脳PCだと1時間くらいかかるんだぜ。
>>452 使うものだけに絞ればその分時間かからないよ。
全部使うわけではないだろ。
UnorderedとかのTR1まわりとバージョンアップを除くと、
完全新規はAccumulatorsとExceptionとUnitsくらいか?
Unitsはテンプレートの使われ方としては目新しいものじゃないが、Boostに入ったことできっと流行る。
boostって事前にビルドするものあったっけ?
windowsだとlibなどをそろえる為の作業が必要
他は知らん
Linuxの場合だと、boostのパッケージがあったりして、コンパイル作業は必要無い場合がある。
boost::systemとかboost::filesystemとかasioとかシリアライゼーションとかはライブラリのコンパイルが必要。
また「boost::filesystemはboost::systemを利用する」みたいな依存関係がある場合があるので、
ライブラリは全部コンパイルしとけばおk
つまり、私みたいにテンプレート関連しか使わない場合は事前ビルドは要らないのです。
boostのコンパイルなんて十分もかからんし
ビルドなんてSTLPortのiostreamくらいしかしたことないや
ビルドといってもコマンドライン一行だけで10分くらいで終わるし。そんなに構えることは無いよ
リンクエラーが出てからビルドしても遅くは無い
boost::unitって何かと思ったらSI単位系か。 なんかの本の例題では見たことあるけど確かに今までなかったな。
boost::exceptionはなかなか面白いよ。
例外をcatch-throwで受け流す途中で情報を追加していくことができる。
optionalとtestが相変わらずテスト通らない
マルチスレッドは鬼門だな
そういえばsignalってスレッドセーフなのか?
sandboxにスレッドセーフな実装が載ってる
3GHzのPCでライブラリのビルドが5時間かけても半分も終わらないんだが
どうやったら10分以下で終わるんだ?
tmpfs + マルチコア
1.36がトップに来たね
ハッシュコンテナ!ヤッター
>>468 boost/sandbox/に見つけましました。ありがとう
boostって何でもあるね
さあboost::unordered_mapとstd::mapの比較ベンチを早く貼るんだ
SVN使っている奴はすでにunordered_setぐらい試してるだろ。
安心しろ。
BoostのUnordered associative containersの実装はとても速い。
Dinkumwareとは比べ物にならん。
boost::unordered_map?なにそれ
皆さんboostとTR1の両方存在するライブラリはどちらを使ってます?
boost
大文字嫌い。
boostとTR1のライブラリが、両方存在する場合は、どちらを使ってます? だろ。
C++の前に日本語使えるようになろうな。
正しくはないと思うが・・・
いちいち上げ足とる奴もどうかと思うな
同じライブラリ(関数やクラス、例えばunordered_map)がboost内にもtr1内にもあるけど、どっち使ってる?
という意味でしょ?
tr1ってのがどの実装のことを指しているかにもよると思うけど。
本人だが
boostとTR1の両方「に」存在するライブラリ
と書くつもりだったんだ。
すまんね
皆さんboostとTR1に両方存在するライブラリのどちらを使ってます?
なら問題ない
しつこい
tr1よりboostのほうがタイプしやすいからboost使ってる
tr1ってなんか暫定的な感じがしすぎて微妙。
boostのほうが完全に公式でないが明確に拡張ライブラリを入れてる感があってスッキリする。
表現しにくいが何となくそんなイメージ
とりあえずC++0x来るまではboostの予定
来るの?
C++0Aだからまだ先だな。
tr1のライブラリの名前空間てtr1のままなの?
いずれstd空間に入らないのかな
入る候補がTR1。
けど俺は階層にして欲しい。
stdに入るものが、C++XXのXX違いで変るのはやめて欲しい。
1.36でfilesysytemの仕様が変わったのか。
前のコードがそのままだとコンパイル通らなかった
すみません。教えてください。
471さんのリンク先のbuild.txtの手順でビルドしたのですが、
ランタイムがスタティックリンクの場合のlib(例:libboost_filesystem-vc90-mt-sgd-1_36.lib)が作成されません。
他のライブラリの都合上、ランタイムをスタティックリンクにする必要があります。
どうすれば作成できるでしょうか。
以下のbjamの設定だと思うのですが、どうしたらいいか分かりませんでしたorz
bjam --toolset=msvc -a link=static,shared threading=multi release debug stage
link-runtime=static
498 :
496:2008/08/20(水) 20:17:47
>>497 早速ありがとうですううううううう。やってみます。
499 :
496:2008/08/21(木) 07:21:42
正しくは
runtime-link=static
でした。うまくいきました。ありがとうございました。
更新しました。SVNは1.37に移行しております。
ttp://booster.x0.to/ >>496 申し訳ございません。staticも作れていたと勘違いしておりました。
VSやSDKの情報も含めてbuild.txtも更新致しました。
そしてビルド時間が2倍に・・・。
501 :
496:2008/08/22(金) 20:35:29
何か役に立ったみたいで嬉しいな。
1.36になってインテリセンスとの相性がめちゃめちゃ悪化しとる・・・
ncb作り直してもだめ?
>>503 ダメ。
どうもヘッダ組み込んだだけでその後全部死ぬっぽい?
どのヘッダが問題なのかまでは調べてないが。
あと新しく増えたunorderedもオブジェクト宣言したとこから死ぬ。
1.35に戻してtr1のunorderedを使うことにします・・・
うちの所では死なないが
boostを一番にインクルードしてるけどね
unorderedなんてかなり昔からSVNから引っ張ってきて使ってるが、
インテリセンスが壊れたことは無いぞ。
>>505-505 そうなの?ウチだけなの?
あとunorderedは1.35にぶち込んで使ってみたので、そのせいかもしれない。
でもtr1のunoderedの方がVCのデバッガとも相性は良いね。
普通の配列と同じように表示されるし。
>>507 してません
spirit使ってるとIntelliSenseが反応してくれないんです><
bindでインテリセンスが効くがあまり嬉しくない。
BOOST_PP_LIST_ENUM の区切り文字を変更できない?
セミコロンにしたいんだが。
BOOST_PP_LIST_FOR_EACH だと、
a;b;c;d;
みたいに最後にもセミコロンが付いてしまう。
>>348 いまさらだが
マクロ展開後の再スキャン中は、そのマクロの展開が禁止されるので、
それを利用して「自分があるマクロから(間接的に)呼ばれたかどうか」が判定できる
unorder_set
プリコンパイルヘッダがきかねー
unordered_set/unordered_mapってメモリ占有領域はどうなってんの?
>>515 vectorより多くなるが、mapやsetよりはポインタの分少なくなるっぽい?
ハッシュテーブルが必要だからでかくなるんじゃないの
ですよねー
空飛ぶスパゲティーモンスターはrejectかな…
PyUblasが便利なんだけど作者があきたらboostのバージョンあがったとたん動かなくなる可能性あるんだよね
ctypes使ったほうが安心なのかな
Creative Commons Attribution-Share Alike 2.5 Licenseだから、
利用者が多ければ、誰かが維持してくれるんじゃないのかな。
GNUの非主流ソフトが辿る末路を見ていれば、それが幻想だということは分かるはず
PyUblasがboost.pythonにとりこまれれば安心なのに
1.36入れてみたんだけど、get_posix_categoryあたりでリンクエラーに
なっちゃうなあ。ソース直せばいけるっぽいけど・・1.35使ってた方が無難?
boost に dirname とか basename 的な関数ってある?どこかわから
boost::filesystemが内包してるんじゃないの
少なくともbasenameはconvenience.hppにある
530 :
527:2008/09/01(月) 04:30:22
basename は leaf() か。
dirname は branch_path().native_file_string() みたいな?
うーん、、、、なんだろうこのセンス。branch_path、、、なにを意味したいのか・・・・
とにかくありがと!
そもそもディレクトリがあって、ファイルがあって・・・
という常識から疑うんだ
世の中は広い
順編成ファイルとか区分編成ファイルとかあったね。
unordered/detail/hash_table.hppの265行目で使われてるhash_table_unique_keysってどこで宣言されているんですか?
VCの機能の「宣言へ移動」をやっても見つからないし、boostフォルダをGREPで検索しても見つかりません。
どういうこと?
そういうこと。
hash_table_impl.hppのclass BOOST_UNORDERED_TABLEじゃないの?
そういうこと。
>>513 うーん、さっぱりわからない。
実装方法が分からなくても、BOOST_PP_REPEAT自体を使うのは簡単だからいいか。
541 :
デフォルトの名無しさん:2008/09/12(金) 22:19:40
>>540 最新版ちゃんとビルドできましたよ。 なんか同じファイルが2つずつ入ってます。
あとマルチスレッド用のスタティックライブラリだけあれば十分ではないですか?
シングルスレッドで動かしても、使えるので。性能に多少違いがあるのかもしれないですが。
別々に分けてうpしてあれば各自で選べますけど。
そもそも、もはやMSVCにシングルスレッドのランタイムは無いわけだが。
543 :
デフォルトの名無しさん:2008/09/13(土) 00:00:12
544 :
デフォルトの名無しさん:2008/09/13(土) 00:30:38
540であがっている物の機能が失われない範囲で不要ファイルを削除して
再圧縮したら28Mで済みましたよ。 デバッグ用のLIBが21M食ってて重いです。
545 :
デフォルトの名無しさん:2008/09/13(土) 00:43:50
BCBのboostも上げてほしいです。 コンパイルがうまくできないです。
ライブラリは全てマルチスレッド(...-mt...)です。内訳は、
boost...-mt.lib・・・ダイナミックリンク、リリース用、バージョンタグ無し
boost...-mt-1_37.lib・・・ダイナミックリンク、リリース用、バージョンタグ付
boost...-mt-1_37.dll・・・リリース用、ダイナミックリンク用ライブラリ
boost...-mt-gd.lib・・・ダイナミックリンク、デバッグ用、バージョンタグ無し
boost...-mt-gd-1.37.lib・・・ダイナミックリンク、デバッグ用、バージョンタグ付
boost...-mt-gd-1_37.dll・・・デバッグ用、ダイナミックリンク用ライブラリ
libboost...-mt.lib・・・スタティックリンク?、リリース用、バージョンタグ無し
libboost...-mt-1_37.lib・・・スタティックリンク?、リリース用、バージョンタグ付
libboost...-mt-s.lib・・・スタティックリンク、リリース用、バージョンタグ無し
libboost...-mt-s-1_37.lib・・・スタティックリンク、リリース用、バージョンタグ付
libboost...-mt-gd.lib・・・スタティックリンク?、デバッグ用、バージョンタグ無し
libboost...-mt-gd-1_37.lib・・・スタティックリンク?、デバッグ用、バージョンタグ付
libboost...-mt-sgd.lib・・・スタティックリンク、デバッグ用、バージョンタグ無し
libboost...-mt-sgd-1_37.lib・・・スタティックリンク、デバッグ用、バージョンタグ付
となっております。
この内boost...-mt.libとboost...-mt-1_37.lib、boost...-mt-gd.libとboost...-mt-gd-1.37.lib、
libboost...-mt.libとlibboost...-mt-1_37.lib、libboost...-mt-gd.libとlibboost...-mt-gd-1_37.libは
それぞれファイル名が違うだけでバイナリは同一です。
libboost...-mt...とlibboost...-mt-s...の違いについては良く分かりません。
バイナリは各々違っており両者共スタティック用サイズなのですが、命名規則の頁
ttp://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming を見るとスタティック用には-sが付く事になっており、libboost...-mt...が何用なのか分かりません。
>>546の続き
ビルドはマルチスレッドのフルセット
bjam --toolset=msvc -a runtime-link=static,shared threading=multi release debug stage
で行い、出来上がったもの+ヘッダを全てrarにパックしております。
とりあえずは良く分からないままあれこれ削除するよりは、全部入りで提供して
使われる方の方で削って貰うのが良いと考えておりますが、明らかに不要な物があれば教えて頂けましたら対応致します。
548 :
デフォルトの名無しさん:2008/09/13(土) 01:14:13
Windows boost binaryを提供している外人のページ
http://www.boostpro.com/products/free でそのインストーラーと実際にインストールされるファイルを比較すると
-sがつくのがシングルスレッド用で、-gdがデバッグ用みたいです。
バージョンタグ無しと、バージョンタグ有りは、完全に同一ファイルであって
ヘッダから呼び出されるのはタグ有りの方だけです。
549 :
デフォルトの名無しさん:2008/09/13(土) 01:22:31
すみません。間違えいるかもしれません。
確実なことは、バージョン付きと付いていないやつは、バイナリレベルで完全に一致しています。
あと、バージョン付いてない方を読ませても読み込まないです。
550 :
デフォルトの名無しさん:2008/09/13(土) 01:28:12
やはりboost proの人はインストーラで-s付きはシングルスレッド用としてます。
でも、
>>546を見ると別のことが書いてあるし判らないです。
>>546 -sが付いているのは、CRTに静的リンク(libcmt.lib使用)で、
ないほうは、CRTに動的リンク(msvcrXX.lib/msvcrXX.dll使用)だったはず。
-gdと-sgdはもちろんデバッグ版のCRT (libcmtd.libとmsvcrXXd.*)を使う。
552 :
デフォルトの名無しさん:2008/09/13(土) 01:46:39
コンパイル時のオプションによっては、バージョン無しが呼ばれる可能性もあるかもしれないですね
すみません。現状維持がいいみたいです。
バージョン指定の有り無しの2ファイルは、
NTFS上ならハードリンクか何かにできれば理想的だよね。
文章があちこち間違っていたり足らなかったりしたので修正。
誤 boost...-mt-gd-1.37.lib・・・ダイナミックリンク、デバッグ用、バージョンタグ付
正 boost...-mt-gd-1_37.lib・・・ダイナミックリンク、デバッグ用、バージョンタグ付
誤 この内boost...-mt.libとboost...-mt-1_37.lib、boost...-mt-gd.libとboost...-mt-gd-1.37.lib、
libboost...-mt.libとlibboost...-mt-1_37.lib、libboost...-mt-gd.libとlibboost...-mt-gd-1_37.libは
それぞれファイル名が違うだけでバイナリは同一です。
正 この内boost...-mt.libとboost...-mt-1_37.lib、boost...-mt-gd.libとboost...-mt-gd-1_37.lib、
libboost...-mt.libとlibboost...-mt-1_37.lib、libboost...-mt-gd.libとlibboost...-mt-gd-1_37.lib、
libboost...-mt-s.libとboost...-mt-s-1_37.lib、boost...-mt-sgd.libとlibboost...-mt-sgd-1_37.libは
それぞれファイル名が違うだけでバイナリは同一です。
追加
>>545 Turbo C++ Explorerで良いのであれば検討しますが、一寸手が回らないかもしれません。
>>548-550 オフィシャル
ttp://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming によると-mtが付けばマルチスレッド用で-sはスタティック用という事になっておりますので良く分からないですね・・・
一応全てのファイルに-mtが付いておりますので、命名規則を信じるならシングル用は混じっていない筈です。
>>551-552 成程、確かにboostのダイナミック/スタティックとC++のそれは別要素ですね。
とりあえずこのままでいきます。
>>553 コンパイル絡みで問題が出ないなら、ハードリンクでかなりファイルサイズを圧縮出来そうですね。
ハードリンクは全く使った事が無いのでこれから使い方を調べなければなりませんが、
間に合えば次回か次々回辺りのビルドで採用してみます。
rarってハードリンク扱えるの?
ぐぐれ
ハードリンク作るbatを同梱しておけばいいじゃん
558 :
デフォルトの名無しさん:2008/09/13(土) 13:13:05
バージョン有りのみで配布して、コンパイルが失敗するか人柱やってもらう。
559 :
デフォルトの名無しさん:2008/09/13(土) 15:48:21
バージョン無しのファイルをコピーするバッチファイルを同封しておいて
解凍後、最後に起動させれば配布サイズが小さくなると思う。
いつも
ありがとう
ございます
2桁目を縦読みか?
562 :
デフォルトの名無しさん:2008/09/15(月) 12:52:41
boost.eggってどこにあるの?
boost vaultかsourceforge.netのpstade libraryのリポジトリ
29: error: no matching function for call to ‘regex_replace(const char
[9], boost::regex&, const char [8])’
とは何?g++とboost1.36
該当する部分のソース:
1 #include <iostream>
2 #include <string>
3 #include <boost/regex.hpp>
4
5 using namespace std;
(略)
25 int main()
26 {
27 boost::regex comp("t");
28 string res;
29 res = boost::regex_replace("testeee2",comp,"abeeeec");
30 cout << res <<endl;
31 return(1);
32 }
regex_replace(string("testeee2"),comp,string("abeeeec"));
オーバーロード解決に失敗してるね
pyublas便利かなって思ってたけど、よく考えたらjson形式のtextデータにしてctypesにtextデータ渡せばそっちのほうが汎用性高いな
効率は悪くないかい?
効率を気にするならpython使わないし
でも大丈夫少なくともrubyやelispよりは効率良いと思うよ
インタプリタ書き換えてrubyの方が速くなったぽいよ
やっぱりだれか作ればBoost.Rubyとかできるもんなんだよな、きっと。
すみません。ひとつご教授いただきたく。
現在boost::asioを使って遊んでいます。
で、せっかくなのでip::tcp::streamでクライアント - サーバー間の通信ものを作ったんですが、
このストリームに対してタイムアウト値の設定ってできないものでしょうか。
socketに対してならハンドラでフツーに定義できましたが、
streamを使用してみたいなぁと思いまして。
573 :
デフォルトの名無しさん:2008/09/17(水) 04:18:31
MPIなんて使ったことが無いが、詳しいサイトなんて、
そりゃBoost公式サイトと、各MPI実装の公式サイトに決まっているだろ。
試すならBoostでテストされているとドキュメントに記されている三つから選べばいいだろ。
pyublasってどういう場面で使っているの?
ublasとnumpyを混ぜて使うメリットが今一歩分からない
numpyはplotやデータ生成
生成したデータをublasのプログラムに流し込む
結果をさらにnumpyでplot
更新しました。
ttp://booster.x0.to/ バージョンタグ無しライブラリをユーザー側で作成する様に変更する事により、ファイル容量を削減致しました。
バッチファイルを2種類同梱しており、実体を作成するかハードリンクを作成するかお好きな方をお選び頂けます。
超乙津
579 :
575:2008/09/20(土) 11:18:07
>>576 なるほど! plotやらにpython使うのは確かに便利だ
pyublasでリンクする手間が凄く小さいならだけど
試してみるかな
レスサンクス!
>>573 MPIならとりあえずmpichでぐぐれ
ただ、MPIは並列処理といってもコアレベルの並列性ではなくて
クラスタとかのPCレベルの並列性を利用するライブラリだよ
581 :
デフォルトの名無しさん:2008/09/24(水) 04:22:25
>>577 乙。
最近みつけたソフトですがZipファイルをマウント出来るソフトがあります。
これを使うと、解凍せずにboostライブラリをコンパイルできます。
最新版のRarをZipに再圧縮したところ126Mになりましたが
これだと展開する手間が無く便利です。
582 :
デフォルトの名無しさん:2008/09/24(水) 04:24:10
クラスAが関数testを持ち
クラスAの参照を保持するクラスBがあり
クラスBの->演算子でクラスAのポインタを返す場合
B b;
b->test();
は可能なんですが
このクラスをshared_ptrに入れて
shared_ptr<B> c(b);としたらもちろんc->test()は通りません
それを通るようにしたいのですが、クラスA又はBに工夫をして何とか通るようにならないでしょうか
shared_ptrみたいなクラスを自作しないと無理ですかね
なんかboostと関係ない気がしてきた
getでもダメ?
>クラスAの参照を保持するクラスBがあり
>b->test();
クラスAの参照はどうやって保持してるの?意味が分からない。
即レス感謝です
getでも結局帰ってくるのはBのポインタなので無理でした^^;
クラスBのコンストラクタでクラスAをnewしてメンバ変数で保持してます
Bにtestという関数を追加すればいいんじゃない?
その実体はAのtestを呼ぶだけ
>>587 最初はそれでやるつもりだったんですが、メッソドや実装したいクラスの数が多かったので
もっと効率のいいやり方がないかと悩んでいました
しかし、やっぱどうあがいても帰ってくるのはポインタなので無理そうですね^^;
shared_ptrをコピーして->演算子などが参照を返すようにするか
諦めて(*c)->test()と書くことになりそうです…
iteraterでよく見る形だが…
それの何が気に入らないんだ?
shared_ptr<B>にB*と同じ振る舞いを期待するならわかるが、
shared_ptr<B>にBと同じ振る舞いを期待するのは、そもそもおかしい気がする。
素直に A *B::GetA() { return p_a; } で。
>>588 諦めるも何も、shared_ptrはポインタと同等の振る舞いなんだから
例え B* c = new B(); と書いたって、(*c)->test()
何かアロー演算子をオーバーロードしたせいで、混同している気がする。
配列の添え字にマイナスを与えたい
ublas::matrix[-5][-3]
とか
boostに、これができそうなのありますか?
むしろC標準でも問題ない
hoge1ならchoge1
hoge2ならchoge2
hoge3ならchoge3
...
それ以外ならchogen
って型を作るにはどうしたら良いでしょうか?
つまり次のようにしたいです
hoge<T>::type // T が hoge1 なら type が choge1,hoge2 なら hoge2, ... それ以外なら chogen
typedef choge1 hoge1
template<typename T> struct hoge{ typedef chogen type; };
template<> struct hoge<hoge1>{ typedef choge1 type; };
template<> struct hoge<hoge2>{ typedef choge2 type; };
...
boost::mpl::atのドキュメントとヘッダが食い違ってる件
>>596をboost::mplで書いてやろうと思ったのにorz
using namespace boost::mpl;
typedef map<
pair<hoge1, choge1>,
pair<hoge2, choge2>
> hoge_map;
template<typename T> struct hoge : at<hoge_map,T /***,chogen***/> {};
>>599 なんでatが使えないんだろうね。
namespace mpl = boost::mpl;
template<typename T> class hoge
{
typedef mpl::map<mpl::pair<hoge1, choge1>,
mpl::pair<hoge2, choge2>,
mpl::pair<hoge3, choge3> > type_map;
public:
typedef typename mpl::eval_if<mpl::has_key<type_map, T>,
mpl::at<type_map, T>,
mpl::identity<chogen> >::type type;
};
mpl使わずに普通に書いた方が短くて分かりやすいねw
一方ロシアはpythonでコードジェネレートした
hogeNまであるとしてNがどれぐらいまでに増えたらmplの方が文字数少なくなるんだろうか
でも、そこまで増えるとしたらアプローチが変わってくるんだろうけど
分かりやすさの点ではmplも特殊化も大して変わらんように思える
hage1ならchage1
hage2ならchage2
hage3ならchage3
...
それ以外ならasuka
って型を作るならどうか?
mplを使うべき場面じゃなかったってことかな?
特殊化で十分書けるし
特殊化で十分というか、特殊化の方がコンパイラに優しいだろ。
コンパイル時間をはかった訳じゃないけど、mpl使うのがコンパイラに優しいとは思えないw
VisualStudio2005にSP1を当てたらboost.randomでエラーが出るようになりました。
コンパイルを通す方法を教えてください。
どんなエラー?
そのまま貼り付けて
出来ればソースも
<memory>と<algorithm>ヘッダでエラーが頻出します。
100以上あるので貼り付ける事は出来ません。
意味があるのは最初の一個だ。
テンプレートは何行もにも分かれてるからその1ブロックだ。
C:\Program Files\Microsoft Visual Studio 8\VC\include\memory(82) : error C3646: 'uninitialized_copy' : 不明なオーバーライド指定子です
そのエラーがでるソースここに書けない?
できればこのエラーがでる最小のソース
#include <boost/random.hpp>
int main(){
return 0;
}
再インストールしかないだろうjk・・・
ありがとうございます。
動くようになりました。
古いlinuxで1.36をbuuldしようとすると
ostreamがない
とかいうエラー出る
619 :
デフォルトの名無しさん:2008/10/02(木) 20:48:36
620 :
デフォルトの名無しさん:2008/10/02(木) 21:15:12
boostぐらい自分でビルドしろよ。
622 :
デフォルトの名無しさん:2008/10/02(木) 22:58:26
無理っす
>>620 最新版とは言っても正式版じゃないのは嫌な人も多いだろう
625 :
デフォルトの名無しさん:2008/10/03(金) 00:58:53
boostの正式版なんてないのでは? 複数の人が個別に更新してるんでしょ?
C++の標準規格になるまでは正式ではないのでは?
いや、Boost全体としてリリースサイクルがあるだろ
知ってることにだけ口出してたら、2chは成立せんなw
「でしょ?」とか「では?」って書いてるんだから、事実の話ではなく、不確かな知識の
確認がしたいんだってのはわかるから、別に混乱も起きないし。
君が美化委員を気取る必要は無いよ。
キモイ
>>629 要は自分を言い負かす奴は全員キモイんですよねw
更新しました。
ttp://booster.x0.to/ 私のビルドはビルド時点での最新のSVNを使った開発速報版ですので、安定版とは位置付けが異なります。
通常は安定版を、開発状況を確かめたい場合や最新のSVNにしか無い機能を使ってみたい場合は速報版をといった風に
使い分けるのが良いのではないかと思います。
ところで開発現場で実際にBoost使ってるとこってあるの?大きい案件で
C++使いすら集まらないのにBoost使うやつなんて絶対集まらない気がするんだが
635 :
デフォルトの名無しさん:2008/10/04(土) 18:34:26
>>634 食わず嫌いと同じ
boostはプログラムの難易度を下げるために開発されてるんだよ
OSに依存しない統一したコードを短く書くためのもの
作るのは至難だが使うのはそう難しくないという。
コンピュータがまさしくそれですな。
637 :
デフォルトの名無しさん:2008/10/04(土) 18:48:04
STLはかなりやさしいし、boostはまだ人柱っぽいけど、ひとつひとつのライブラリを利用するのは
そんなに難しくない。 以前からあるwindowsプログラム、DirectXを使う方が断然困難とおもうんだが
>以前からあるwindowsプログラム、DirectXを使う方が断然困難とおもうんだが
Boostには現在、GUIやグラフィック描画のライブラリがないので比較しようがないと思うんだが。
639 :
デフォルトの名無しさん:2008/10/04(土) 19:00:52
ポリシーでboostやC++を使わないのは、かまわないが
いざ使う事になって、使えなせないのはヘボだって事だな。
比較は出来る。
0から初めて習得に掛かる時間を比べたらDirectXのほうが断然上(難易度高い)。
習得時間で難易度を比較するのか?
じゃあスワヒリ語とC++の難易度の差も、習得時間というモノサシだけで、同様に比較できるわけか?
641 :
デフォルトの名無しさん:2008/10/04(土) 19:15:34
どの位の期間で開発に参加出来るかは大事
shared_ptrとかtupleとか今すぐ使えるものがたくさんあるし。
使用可能なヘッダを指定すればいいんじゃないか。
MPLとプリプロセッサをお忘れなく。
一方ロシアはPythonでメタプログラミングをした。
そりゃロシア人ならPythonを使うだろ。
何しろevalがあるんだから。
evalといえばboost::proto
なかなかカオスだぞアレは
>>640 揚げ足もあんまり必死に取りに行くと、ただ本人がバカに見えるだけでジ・エンドだよ。
相手をバカに見せたくて必死な君としては、これ大問題じゃないの?
興奮のあまり、いつの間にか「だけで」とか新条件加えちゃってるし。
>>648 >>638を受けた上で、「それでも比較できる項目はあるぞ」って言ってるんだろ。
それが唐突に「言語は習得時間というモノサシだけで比較できる」と言ってるかのように曲がってる。
bjamは習得に時間がかかる上に重く、汎用性も無い
各種ビルドツールの悪い所を寄せあつめたかのような最強の糞makeツールだと思うんですが
何でboostではあれが標準なの?ユーザーであんなの使ってる人いるの?
rakeとかSConsで一瞬でできる事でもとても面倒な事せにゃならん
MLでやれ
片仮名でブーストって書くと急に格好悪く感じるんだが
自分で自分の感性の意味がわからん。
きっとお前が快獣ブースカを知っているほどのオッサンだからだ。
いや、すまん、その怪獣マジ知らない。
なんか、逆にあんたの年代だけ明らかにしちゃったみたいで申し訳ないが・・・。
ブースカくらい知っとけバカやロー
いや、気にするな。その頃俺はまだ生まれていない。
じゃあ逆にBooskaC++Libraries作って格好いいイメージ持たせようぜ。
ビルでも動かす怪力なのに
Буска C++ Libraries
boostはportablityが低すぎるからな。
日立とかのコンパイラで全く通らないから
他のベンダ系企業でも多分使うのは無理だな。
gccとVC++で動けばたいてい事足りそうだが
あとはSunのコンパイラとAIXとか?
DMC++最高に格好いいっす
>>661 全部がだめってことは無いだろ。互換性が厳しいのはmplとかlambdaとかぐらいじゃないのか?
実装依存な部分もあるようだが、そういう違いを平らにしてくれるメリットの方が大きいと思うよ。
boost内でのmplの使用箇所がどんどん増えてるけどな
mplは見かけ以上に互換性高いよ
lambdaは微妙だとしてもだ、MPLの実装には環境依存のコードは何も必要ないだろ。
今の実装には、環境依存のworkaroundが大量にあるとしてもだ。
だからMPLが使えないコンパイラというのは、そもそもC++のコンパイラじゃないからどうでもいいよ。
>Boost ライブラリはテンプレートのような現代的な C++ の機能と
>C++ 標準ライブラリに依っている。多くの現代的なコンパイラは
>それらの有名な機能をなかなか良くサポートしている。しかし C++
>標準の採択から数年を経た今となっても、いくつかのコンパイラは
>部分特別化のような、重要なマイナー機能をサポートしていない。
>Boost ライブラリの作者はしばしば機能の不足しているコンパイラ
>環境で作うまく動かそうとしてたくさんの努力を費やす。それにも
>かかわらず、いくつかのライブラリはいくかのコンパイラで全くコンパイル
>されないか、機能を減らされているかもしれない。たとえコンパイラの
>最新リリースが Boost ライブラリをサポートするとしても、古いバージョン
>のコンパイラは正しく動かないかもしれない。
boostではコンパイラの限界も試されますよと。どのコンパイラも仲良くといこうね
という世界ではない気がする。
特にboostに限った事ではないが、C++のコンパイラ開発自体、敷居をうんと高くして市場の独占を図ろうとしていると言うことらしい、
そのために標準に準拠していると言う建前のコンパイラは少なからぬバグを抱える羽目になる、C++の宿命見たいなものなのかねぇ
嘘乙
>>671 さてm1とm2のプリミティブはどっち?
typedef int A;
class T {
A m1;
typedef double A;
A m2;
};
×さてm1とm2のプリミティブはどっち?
○さてm1とm2のプリミティブはなに?
日本語の使いかたおかしくね?
「m1とm2の型はなに?」なら分かるけど
>>672-673 コンパイルエラーになるのが正解のはず。D&Eで取り上げられていたから印象に残っている。
まあ試してみたら、VC++ 9でコンパイル通っちゃったけど。
(g++ 4.3.1ではエラーになった)
>>672 m1はint型でm2はdouble型なので、どっちもプリミティブ。
>>676 m1もdoubleじゃね?class/structの中に限って、上下関係無視するはず。
678 :
デフォルトの名無しさん:2008/10/05(日) 21:57:08
以下のソースのmainでコメントアウトしてある動作を期待してるのですがMyReleaseが呼ばれませんorz
bindの使い方がおかしいと思うのですが、どう直せばよいでしょうか? g++ 4.3.2です
struct Hoge {
bool (*Release)(Hoge*);
// private
int id_;
};
bool MyRelease(Hoge* thiz) {
std::cout << "Release: " << thiz->id_ << std::endl;
delete thiz;
return true;
}
bool CreateHoge(Hoge** h) {
static int nextid = 0;
(*h) = new Hoge;
(*h)->id_ = nextid++;
(*h)->Release = MyRelease;
return true;
}
int main(int ac, char** av) {
using namespace boost;
//Hoge* hoge = 0;
//CreateHoge(&hoge);
//hoge->Release(hoge);
shared_ptr<Hoge> hoge; {
Hoge* hoge_;
CreateHoge(&hoge_);
hoge.reset(hoge_, bind(bind(&Hoge::Release, hoge_), _1));
}
return 0;
}
Releaseはただの関数(へのポインタ)、たまたまhoge_->Releaseで得られるだけなんだから、
hoge.reset(hoge_, bind(hoge_->Release, hoge_));で。
>>678 > bind(bind(&Hoge::Release, hoge_), _1)
この部分、全体で一引数関数を作ることを意図してるんだと思うけど、実際には
bind(&Hoge::Release, hoge_)
という関数(引数を捨ててhoge_.Releaseを返す関数)が作られて、それに対してbindしてる
boost::bindの代わりにboost::lambda::bindを使えば意図した動作になった
ところで
bind(bind(&Hoge::Release, _1), _1)
じゃなくていいのだろうか
682 :
678:2008/10/05(日) 22:32:03
boost::bind(hoge_->Release, hoge_)
boost::lambda::bind(boost::lambda::bind(&Hoge::Release, hoge_), boost::lambda::bind::_1)
両方で期待していた挙動を示すことを確認しました。
ありがとうございます。
683 :
デフォルトの名無しさん:2008/10/08(水) 11:08:34
やべぇBoostすげぇってのは各ライブラリみて分かったんですが、
各ライブラリの使い方ではなくて、実例集みたいなの公開してるところってないですか?
プログラム本って文法書はたくさんあるのに、コードコンプリートみたいな本が少なくて
想像力、発想力がない奴には独学きついっす。
実例は実例で、見ても何やってるか分かんなくてなw
使い方と生きたコードの中間になるようなサンプルが欲しいとは俺もよく思う
実例集って何だ?
俺の言語感覚では、実例集ってのは、実際の使い方やサンプルコードの類だと思うんだが
使い方ではないとはこれいかに。
実装方法か?
>>684 Asioのサンプルは比較的そういう感じに近いと思う。
VBの技100とかそういう系のミニサンプル集のことじゃね?
あーあの使えないシリーズね
>>684 まだ斜め読みしかしてないけど
>>633 の本あたりを求めてそうな感じだな
この本、文字列をわざわざ日本語にしてるみたいだけど
やめてほしいな
typedef std::map<std::string, std::vector<int> > map_type;
map_type m;
m["奇妙?"].push_back(3);
m["きもい?"].push_back(4);
とか。翻訳者はLokiの人か
乙
"きもい"が本に使われるほど標準語化しているのか。
俺としては言葉狩りしてでも廃絶すべき言葉の筆頭なのだが。
言っておくけど恋空とかは本じゃなくてケツ拭く紙とか焼き芋の焚きつけだからな
VisualStudio2005でtupleをlexical_castで文字列に変換して元に戻そうとしたのですが例外が出ます。
下のソースでストリームはOKですが、lexical_castは例外が出ます。何故でしょうか。
lexical_cast内でストリームからの読み込みがうまくないみたいです。STL portに変えた方がいいのでしょうか?
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp>
int main(int argc, char* argv[])
{
typedef boost::tuple<double,double,double> D3;
D3 d30=boost::make_tuple(101,102,103);
std::stringstream strm;
strm<<d30;
D3 d31;
strm>>d31; // OK
std::string str=boost::lexical_cast<std::string>(d30);
D3 d32=boost::lexical_cast<D3>(str); // 例外
return 0;
}
697 :
695:2008/10/12(日) 17:21:25
>>696 ありがとうございます!!その通りでした。パッチを適用したら変換できるようになりました。
素晴らしい
Lokiのスレがないのでこちらで質問させていただきます。
//static_check.h
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
最後の(void)ERROR_##msg; は何のためにあるのでしょうか。
直前にERROR_##msg があるので不要なように思うのですが。
実際VC2008EEとbcc5.5.1ではなくても同じコンパイルエラーメッセージでした。
また(void)は何のためにあるのでしょうか。
699 :
698:2008/10/13(月) 12:14:38
[使用部分]
STATIC_CHECK(0, aho);
[VC2008EE]
error C2079: 'ERROR_aho' が 未定義の struct 'Loki::CompileTimeError<__formal>' で使用しています。
[bcc]
エラー E2450 未定義の構造体 'Loki::CompileTimeError<0>'(関数 main(int,char * *) )
推測だけど、「変数が定義されたが使われていない」という無用な警告を抑止するためじゃないの?
voidへのキャストも警告がらみな気がする
701 :
698:2008/10/13(月) 14:11:45
>>700 なるほど。気づきませんでした。VCで警告を最大にしたところ、確かにそのような警告が出ました。
でもvoidの方は出ないですね。
boost::fusionについて教えて下さい
同じ型構成のfusion::tupleのインスタンスの値2つを受け取って、
それぞれの同じ位置にある同じ型の値同士で演算を行って
同じ型構成の値を返す演算をしたいと思ったのですが、
どうやるのか、そもそもできるのかが判りません
transformを使って
template<typename T>
T fuga(const T& x, const T& y) {
return x + y;
}
struct Hoge {
template<typename T>
T operator()(const T& x, const T& y) {
return fuga(x,y);
}
template<typename T>
struct result {
typedef T type; // (*)
};
};
z = transform(x, y, Hoge());
みたいにできないかと思ったのですが、関数オブジェクト内で定めている
返り値の型(*)を動的に定められる訳がないので当然うまくいきません。
よいお知恵を頂けないでしょうか m( _ _ )m
>>702 単にresultテンプレートの書き方が間違ってるだけ
struct Hoge {
template<typename T>
T operator()(const T& x, const T& y) const { /* operator()はconst */
return fuga(x,y);
}
template<typename T>
struct result;
template <typename T>
struct result<Hoge(T, T)> {
typedef T type;
};
};
これで通ったよ
704 :
702:2008/10/15(水) 03:22:59
寝る前に覗きに参りました
>703
今眠い上に酔ってて頭が回りません orz
コンパイルが通って動くところまでは確認しました
明日ちゃんと確認しておきます
ありがとうございました!
時間的に酒を飲みながら
>>702を書いたってことか?
新しいboostを使いたい場合VisualStudioは2005のままにしたほうがいいのでしょうか?
707 :
デフォルトの名無しさん:2008/10/17(金) 13:45:02
2008
709 :
デフォルトの名無しさん:2008/10/17(金) 20:31:23
すみません。以前に書き込んだんですけど、ZIPで配布して貰えないですか?
ZIPだとマウントして使えるので、解凍しなくて使えてHDDが1G以上節約できるので。(解凍しても使えます。)
サイズが、70M → 125Mくらいになってしまうのですが。
自分でやれよそれぐらいw
711 :
デフォルトの名無しさん:2008/10/17(金) 20:48:15
ZIPのマウントなら、boost一見さんにも優しいですよ。落とせば直ぐに使えるので。パスの設定はいりますが。
まず、WindowsにZIPのままマウントする機能が標準搭載されているわけではない(よな?)のだから、
一見さんにも優しくなるとは思えない。
RARはマイナーだからとかそういう理由ならまだ分かるけど。
上の方でファイルが重複だとか騒いでる上げっ放しの奴と同一人物だから放置しとけ
ZIPにくら自分ですればいいよね?
最初はファイルが重複だファイルサイズをこれだけ減らせるとか言って中の人に手間かけさせて、
今度はファイルサイズが大きくなってもいいからzipにしろとかどんだけ自己中だよ
716 :
デフォルトの名無しさん:2008/10/17(金) 21:21:08
普及とみんなの便利のための発言なんです
なんという詭弁
718 :
デフォルトの名無しさん:2008/10/17(金) 21:48:37
HDDやCPUがしょぼいと空き領域を圧迫し、展開時間も掛かるんです。
重複有りだとどちらも多くなります。ZIPのマウントならば、120Mしか掛からず、展開せず直ぐに使えない。
一見さんがやめたい場合もZIPを消すだけです。
訂正
展開せず直ぐに使えない。 -> 展開せず直ぐに使えます。
>>709 HDDが足りないのなら必要なものだけビルドすればいい。リンクエラーが出てからで十分。殆どはビルド不要。
boostのホームページのインストーラを使えば必要な機能だけ選択してインストールできる。
ZIPマウントするソフトを入れる手間を過小評価しすぎだ。
下手しなくてもBoostの導入よりよっぽど敷居が高いぞ。
インストールしたら、ZIPファイル上で、クイックマウントを選ぶだけですよ
遅くなったりしません?
しょぼいCPUでBoostを使うだと…
mplとかspiritとか使うとコンパイルが遅くて泣くぞ?
現状RARで配布しているんだから、RARをマウントするソフトを作れば解決だね、もちろん709さんが。
それは冗談だが、そもそもbooster.x0.toのは最新を追っかけている時点で初心者・一見さん向きでない感じがする。
709がrarをマウントするソフトを作ればいいじゃない
そしたら自分が無料ホームページにZIPにしたやつうpするか
回線が50KB/s、登りが10KB/s以下なのでサーバーは無理だ
Boostはテンプレートきちがいな作りのせいで無駄にコンパイルが長いな。
逐次コンパイル向けのディレクティブ設定とかないの?
プリコンパイルドヘッダ
プリコンパイルってまとめて全部出来ないですか
全部欲しけりゃ全部includeすりゃいいじゃないか。
いつでもプリコンパルしてあるようにincludeやlibなどに配置できませんか
うぜえよ
自分で試せよな。
boostの新しい本が出てたので買ってみた。各機能について丁寧に説明されていていい本だね。
ピアソンのやつか。高いんだよな…でも買ってしまいそう
1.37がもうすぐリリースされるみたい
asioではパイプを扱うのは無理ですか?
1.36だとPOSIXファイルディスクプリタやWindowsハンドルを使えるからいけるんじゃないの?
741 :
740:2008/10/22(水) 03:11:31
posix::stream_descriptorできました
これはUNIXドメインソケットしか使えないと思っていました
ありがとうございます
>>736-737 あんまり範囲を広げずによく使うやつに絞って解説されてるのがいいね。
原書はちょっと古いらしいが、古びない内容だと思う。
すでにバリバリに使ってる人には物足りないだろうな。
ublas::matrix m(10,11);
m[2][3];
ができなくなって
m(2,3);
に統一されたのはなんで?
poolについて質問です。
mallocあるいはconstructから返されたポインタを、生のポインタで扱うのは危険じゃないかと気になりました。
(deleteしてはいけなかったり、poolオブジェクトが寿命がつきたらポインタにアクセスしてはいけなかったりと・・)
解決方法は、
1、安全性を重視して、ハンドルクラスを書いてハンドルで扱う
2、そもそも速度が欲しくてpoolを使っているのだから、注意深く生のポインタを扱う
他にありますでしょうか?
poolって外部にさらして直接扱うようなもんじゃないと思うけど。
コンテナみたいに外部からは意識しなくてもいいようにすべきじゃね?
>>745 うーん、生成したいオブジェクトのコンストラクトと、poolが切り離せないのが困ります。
vectorのpush_backは構築されたオブジェクトを引数で受け取って、コピーコンストラクタで内部にコピーしてますよね。
これだと効率が悪くてまずいです。
>>746 今は無理だが、C++0xを待ちたまえ。
コンテナにemplaceが追加されるぞ。
Variable Templatesを使ってコンストラクタへの引数を受け取るpush_backなどだ。
>>747 おーそれは便利ですね。
しかし、現状poolの使い方が設計的な意味で難しいですね。
どうラップすればよいのか・・。
Variadicだった。
そもそも、poolに期待するのは、サイズ固定でmallocと同じような振る舞いだろ。
>>743 実装量の割に合わないからじゃないの?
(2,3)とかってやるほうが早いし.
[2][3]を許す場合matrix_expressionから派生すべてのクラスで
proxyクラス作らなきゃだし.
あと関数プログラミング系のライブラリとの相互運用性も operator() のほうがより高いかと
容量削減が目的だったら、7zのほうが縮むかもしれないぞ。
本家も使っているし。
縮んでも7zは時間掛かる RARはトータル(負荷・時間・圧縮率)で良い
5倍掛かって、10%程度だろ
7zそんなに重いか?
rarは圧縮は有料なのが問題位かな。
正規ライセンスのソフトで圧縮してるならいいが、
不正なライセンスとか未登録状態で圧縮してるなら、
解凍して利用する側まで不正なライセンス使用に汚染される。
7-zipでデフォルト(64)がいいよ。 サイズが現状より70%増える(サイズ120M)けど
解凍せずに使えるので。 上でzipといってた人です。 一見さん、最新版に直ぐ入れ替えたい
人にもお勧めですよ。 zipのままコンパイルにつかえるので
>>752 ボランティアでやっているんだ、あんたの好きにすればいいよ。
つーか、ここはあんたのアンケート会場じゃないんだから情報収集するなよ。
また>757みたいなのが沸いて鬱陶しいじゃないか。
圧縮馬鹿しねよ。
圧縮形式なんてどうでもいいよ
TARでもGCAでもACEでも好きなの使ってくれ
ヘッダを覗いてみたのですが、
正しい解釈か自信がないので質問させてください。
boost::shared_array<A> arr(new A[100]);
A* a = &arr[99];
とした時、aにはarrの保持するA型配列99番目の要素へのポインタが格納される。
でOKでしょうか
>>761 先頭要素を 0 番目と呼ぶならそのとおり。
boost 関係なくね?
>762
回答ありがとうございます。
迷ったのですが、一応通常の配列アクセスではなく、
shared_array側でオーバーロードされた[]を利用しているので、
こちらで質問させていただきました。すみません
Boost 1.33.0から1.36.0に変えてビルドしたらアプリがハングするようになったんだが、
mutexとかshared_ptrまわりでなんか変更あった?
Boost.Threadは結構変更されたと思う
使ってないから詳しくは知らんが
所有権というのは架空のものですので、
それを実装するのはあなたです。swap()に書いたり。
C++0xではそれを実装する場所は、
move semanticsを記述するoperator=(T &&)のところになります。
>>767 すみません、よくわからないです。
所有権とはdeleteする義務だと思っていました。
生のポインタを取り出すだけならget()でできますが、これをそのまま別の場所に保管していても、
shared_ptrのデストラクタでdeleteされてしまいますよね。
どうすれば一度shared_ptrに入れたポインタのdeleteの義務をshared_ptrから移すことができるんですか?
> もし *this がポインタ p と削除子(deleter) d を 所有 していれば、d(p) を呼び出す。
だし、swapでポインタは書き換えられるし。
>>768 そういう意味では、shared_ptrから所有権をもらうことはできない。
(基のQにあるように、そもそもreleaseが無い以上uniqueであっても手段がない)
だから、中身を移すことで似たようなことを再現することになる。
shared_ptr<T> sp(new T);
T x;
swap(x, *sp); //0xならx = std::move(*sp);
>>769,770
boostのサイトの文を勘違いして読んでいました。
例えrelease関数が用意されていたとしても、uniqueでなければ所有権譲渡にならないという意味だったんですね。
object_poolのテンプレート引数にクラスX渡し、construct関数を呼んだ時、
Xのoperator newが定義されていない場合(デフォのまま)でも、コンパイルエラーにならないのはどういう仕組みなんですか?
Xのoperator newは関係がないから
object_pool.hppの74行目
try { new (ret) element_type(); }
これはoperator newではないんですか?
関係あるのはelement_typeのコンストラクタであってoperator newではない
すみません初歩的なところを忘れていました。
<new>に
void* operator new(std::size_t, void*) throw();
が定義されていました。
thxでした。
element_typeにoperator new(void*)か何かが定義されていれば
それが使われるだろうが、例えそれが無くても<new>にある
大域名前空間のoperator new(void*)が見つかるので問題ない。
new (ret) element_type();
は配置new構文であってoperator newと直接の関係は無いからな
779 :
698:2008/10/28(火) 20:11:15
>>701 (void)はlokiの別のソースで、get rid of warning と書いてありました。
スレ違い気味ですが、ご報告まで。
lintみたいなスタイルチェッカーにかけると、printfの戻り値が使われていません的な警告が出る(出た)んだよ。
それがうざいから(void)printfと書いてある古いソースは結構ある。
781 :
698:2008/10/28(火) 20:44:17
>>780 なるほど。ありがとうございます。でも ERROR_##msg は変数ですよね。
宣言と式文
式文がないと使ってねーよのwarningが出る。
1.37.0のβとれたみたい
最近バージョン上がるの無茶苦茶速いね
786 :
デフォルトの名無しさん:2008/11/03(月) 22:06:43
Boost 1.37.0 age
% bjam
...patience...
...found 660 targets...
...using 1 temp target...
...updating 2 targets...
...using <p../../../bin.v2/libs/optional/test/optional_test_ref.test/gcc-4.2.4/debug>optional_test_ref...
testing.capture-output ../../../bin.v2/libs/optional/test/optional_test_ref.test/gcc-4.2.4/debug/optional_test_ref.run
====== BEGIN OUTPUT ======
optional_test_ref.cpp(351): test &(*orci1) == &ci failed in function: 'void test_binding()'
**** 1 error detected
EXIT STATUS: 201
====== END OUTPUT ======
相変わらずこのテスト通らないんだな…
>>784 ネタ切れになるとやたらとバージョンを上げるようになるw
GUIライブラリまだー?
いやいやまずはXML DOMでしょう。
WXWidgetsの事、たまには(ry
wxWidgetsはまあ使えるけど、あそこからModern C++的に納得の行く出来にするのは
無理っぽい気が
あれはなんかMFCぽくてイヤw
Qtの方がまだいいよ。
mocの部分のtemplate化が出来たら問題なし。
jsonはやりとりできるの?
クアッドコアのマシンを用意して
ovenとかspiritを使ったコードでもflymakeを使って楽したい
1.37の新機能のレビューをお願いします
英語くらい読めよ
VC9.0SP1を使ってるんだけどもしかしてBOOST_TYPEOF使えなくなった?
VC++にはいつ標準装備になるんだ?
. ' _ 二二 _ .、
/ /´ -‐…‐- .`\
/ /´ i !`ヽト、
. ,ヘ ,' i ! ! | |i |ハ i ヽ キリッ
/ ゝ! ノ| ! !::__!::ノ ´  ̄ i::.i |!
\ .| .:i i :i i |´ \ / `!、ハ:!
`ヽi 从 i i | ニニミ .ニニ !:::::| VC9.0SP1を使ってるんだけどもしかしてBOOST_TYPEOF使えなくなった?
. | YハiハN {r::リ` ´{r::リ '::::N
. | ヽゝ ´´ ``ハ!`
. |∧ Y! ′ ,':::|
j/∧ _!::} 、 ⊂' ..イ:::::|
///∧´ ∨ ` ,.... ィ´゙Y:::::|
. /////∧ ヽ {ト、∧ |::::::!
,< ̄ ̄∧ } `ヽ >''} { ̄`ヽ
. / `ヽ:::::::::Y´ヽ i´`∨::::∧
/ ∨:::::| .:: ! i .:.: !::::/ i
_ ___
,. :'´: :,. -―‐-ミ:ヽ、
/: : : :厶ィ': ´ ̄ ̄ヾ : :\
/: : : : : :.!: :M: : : : : }、: ヽト、:.\ <じゃっておwww
i: : :.!: : : レ‐' ` ̄⌒ ⌒" トヘ:ハ!
ト--|: : :.!: : 、| ー‐'' ´ `'ー }: :.ト
ミ ミ ミ : :!: : : :! z=≡ ≡z.{: :.ハ ミ ミ ミ
/⌒)⌒)⌒.ハ :_Nとつ \\\ C VVリ /⌒)⌒)⌒)
| / / /:弋こ \ヽ __,. } (⌒)/ / / //
| :::::::::::(⌒) : :}\ / 1 / ゝ :::::::::::/
| ノくf⌒Y ` {_ _,ノイ| / ) /
ヽ / ヽ ヘ,、 _「 |::!:::::} / / バ
| | l||l 从人 l||l.!::|イ:::ヽ_./ l||l 从人 l||l バ ン
ヽ -一''''''"~~``'ー--、/:::::イ; -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ):::/} (⌒_(⌒)⌒)⌒))
VC8,7.1でのnative typeofはバグを利用して無理矢理実装したものだから
本来native typeofは使えないものなんだよ
おつ
boost::exceptionについて質問なのですが、キャッチした情報にさらに上乗せして再スロー
出来ると思っていたのですが、同じタグで情報を流しこむと上書きされてしまうようです。
class MyException : public boost::exception{}
try
{
MyException
}
catch()
{
これでは上手く上乗せできないように思えるのですが、
また、let's boostを見ていたら
「スレッドを超えて例外を飛ばす場合のデータの所有権管理などもうまいことやってくれる模様」
とあったのですが、これはどういうことなのでしょうか?
また、同じタグの情報を複数残せませんが、キャッチしたexceptionクラスにそこで
すみません思いっきり入力途中でした。。。
boost::exceptionについて質問なのですが、キャッチした情報にさらに上乗せして再スロー
出来ると思っていたのですが、同じタグで情報を流しこむと上書きされてしまうようです。
class MyException : public boost::exception{}
typedef boost::error_info<struct tag_errmsg, string> errmsg_info;
try
{
throw MyException() << BOOST_ERROR_INFO << errmsg_info("error1");
}
catch(MyException &e)
{
e << BOOST_ERROR_INFO << errmsg_info("error2");
std::cout << boost::diagnostic_information(e);
}
----出力結果-----
.\src\app\App.cpp(110): Throw in function void __thiscall App::Start(void)
Dynamic exception type: class MyException
std::exception::what:
[struct tag_errmsg *] = error2
[struct tag_errno *] = 123
そもそもこんな使い方であってるんでしょうか?
もっと効率のいい例外処理方法がありましたらご教授願えませんでしょうか。
また、let's boostを見ていたら
「スレッドを超えて例外を飛ばす場合のデータの所有権管理などもうまいことやってくれる模様」
とあったのですが、これはどういうことなのでしょうか?
長文すみませんでした。
そりゃあ同じ型なら上書きされるさ。 そういうものだもの。
それが嫌なら自分でBOOST_ERROR_INFOに相当するものを書くしかない。
template<int i> struct my_error_line;
#define MY_ERROR_INFO(i) error_info<my_error_line<i>, int>(__LINE__)
こんな具合に。
毎回iに違う定数を入れておけば、違う型だから上書きはされない。
定数iの代わりにBOOST_CURRENT_FUNCTIONなんかを使えればスマートなんだろうけど、
文字列リテラルを式の中で一意な型に変換する方法が思いつかないのであきらめた。
1.37だとBOOST_ERROR_INFOはBOOST_THROW_EXCEPTION()マクロで置き換えられているから、
それなら
#define MY_THROW_EXCEPTION(e) MY_THROW_EXCEPTION_IMPL(e, BOOST_CURRENT_FUNCTION)
#define MY_THROW_EXCEPTION_IMPL(e, f) \
{ \
struct my_error_line##f; \
boost::throw_exception(e) << error_info<my_error_line##f, int>(__LINE__);\
}
のように書けば、投げ直す度に情報が記録される。 万全を期すなら関数名と行数で型名を作ってもいいね。
スレッド越しのthrowは使ったことがないので他の人の解説希望。
811 :
808:2008/11/18(火) 16:44:57
解凍ありがとうございます。
C#のように、キャッチした例外を包含して再スローできるのかと思ってたのですが違うんですね。
1.37をインストールして、教えてもらった方法で試してみます。
>>811 お前の考えているC#のってどんなのだ?
catch( Exception e )
{
throw new System.Exception( "エラー", e );
}
みたいな。↑みたいなメッセージではあまり意味がないですが^^;
最上位で包含してる例外オブジェクトを拾ったり、まとめてエラーログの出力などができて便利です
ならコンテナで情報を持つようにして、キャッチー>再スローの時にコピーして新しいメッセージをpushする
とかそういうのでいいんじゃないかねぇ
そういうのを自作しようかと思います。
boostと関係なくなってしまいましたがありがとうございました。
>>809 > 「スレッドを超えて例外を飛ばす場合
例外オブジェクトのスレッドを越えた持ち運び時の
スタックアロケーションなハンドルとの関係など。
>>813 error_info として source_exception とか作ればいいんじゃないか?
それをライブラリで用意しといて欲しいとは思うけどね。
乙
boost::mpl::vector_cの中に格納されている値の最大値を得る方法が分かりません。
boost::mpl::max_element<boost::mpl::transform_view<boost::mpl::vector_c<int, 0, 1, 2, 1, 0>, boost::mpl::_1::value> >::type::value
でうまくいきません。
自己解決しました。
どうやらboost::mpl::_1とした上でboost::mpl::derefを使えば良いようです。
ありがとうございました。
どうでもいいけど横なげえ
「俺がboostだ!」
俺が…俺たちがboostだ!
俺progress_displayな
じゃあ俺program_optionsで
じゃあmplで・・・
configは俺一人で十分だ…(ズキューン)
type_of「狙い打つぜ」
progress_display「万死に値する」
じゃあ俺は意味不明なエラーメッセージ吐くよ
xpressive「楽しいよなぁ、regex!regexーーーー!」
regex「.objのサイズを測ってみろよ・・・
xpressive、テメェーの.objは一体何MBだァーー?言ってみやがれッ!」
mpl「私色に染めてもらおう」
すみません質問です
boost::functionで、引数を二つ以上持つメンバ関数を渡す方法が分かりません
LRESULT App::f(UINT, UINT) があった場合
boost::function2<LRESULT, UINT, UINT> func = std::bind1st( std::mem_fun(&App::f), this );
とすると
error C2784: 'std::mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (__thiscall _Ty::* )(_Arg))'
: テンプレート 引数を '_Result (__thiscall _Ty::* )(_Arg)' に対して 'LRESULT (__thiscall App::* )(UINT,UINT)' から減少できませんでした
と言うエラーが表示されてしまい困っています。
メンバ関数でないか、引数が一つであれば正常に動作するのですが、何がいけないのでしょうか
宜しくお願いします。
>>837 std::mem_funは、引数無しか引数が一つのメンバ関数しか受け付けないから。
boost::mem_fn使え。
あと、その場合だとbind1stもダメだからboost::bindを使う。
そして、boost::bindを使うなら、boost::mem_fnは不要となるのであった。
こうか
boost::function<LRESULT(UINT, UINT)> func = boost::bind(&App::f, this, _1, _2);
つくづくfunctionとbindの組み合わせはすばらしいな
autoが入ればいらなくなるboost::functionも多そうだけど
std::string みたいに、デフォルト引数あり+オーバーロードしまくりな場合に
bind はむきー!となって死ねるので、個人的には lambda 式に期待している
なぜboost::pool_allocatorはテンプレート引数が3つなのですか?
おかげでtemplate-templateパラメータでデフォルトのアロケータとの混在ができません。
ならラップすれば良いだけの話。
rebindじゃだめなの?
rebindするのに3つ引数が必要だろうが。しかもrebindされた結果も3つの引数取るし。
ここは別のクラスを作ってラップするのがベター。
846 :
837:2008/12/12(金) 16:17:16
>>838-840 返信遅れてすみません。bindでうまくいきました!
しかしなんて言うか・・・すごいなBoost
すごいを通り越してキモイww
bindはboost::bindと、boost::lambda::bindの2つがあるけど
ラムダ版のほうでとっとと統一してほしいところ
あと、phoenixとlambdaの統合も早いトコよろしく
統合しなくていいからphoenix::delete_をよこせ。話はそれからだ。
関係ないが、boost::asioがdetail以下に独自のthread / mutexを持ってたりして気になった。
boost::threadはビルドしないと使えないのを嫌ったのかな…。
poolも独自のmutex持ってるね。
gcd/lcmになるともう(ry
Asioはどうせビルドしないと使えないBoost.System使っているんだから、
Threadの使ったって俺は気にしないのに。
いつの間にやらBOOST_FOREACHでインテリセンスが
御臨終するようになったので、代案を考えてみた。
namespace ezforeach_util {
//配列とコンテナの扱いを共通化する為のbegin,endフック
template<class PtrT, class AryT, size_t N>
PtrT GetBegin(AryT (&Ary_)[N]) {
return &Ary_[0];
};
template<class PtrT, class AryT>
PtrT GetBegin(AryT &Ary_) {
return Ary_.begin();
};
template<class PtrT, class AryT, size_t N>
PtrT GetEnd(AryT (&Ary_)[N]) {
return &Ary_[N];
};
template<class PtrT, class AryT>
PtrT GetEnd(AryT &Ary_) {
return Ary_.end();
};
};
//インテリセンスに負荷をかけない簡易foreach
#define ezforeach(ITR_T, ITR, CON) \
for(ITR_T ITR = ezforeach_util::GetBegin<ITR_T>(CON); \
ITR != ezforeach_util::GetEnd<ITR_T>(CON); ITR++)
使用例
typedef std::vector<std::vector<int>> vec_t;
vec_t v;
int a[10];
v.resize(5);
int c = 0;
//引数はコンテナイテレータ型、イテレータ、コンテナ
ezforeach(vec_t::iterator, itr, v) {
itr->push_back(c++); //中でもインテリセンスが効く
}
//配列の場合は要素のポインタ型、ポインタ、配列
ezforeach(int*, ptr, a) *ptr = 1; //一行表記も可
1. そのGetBegin/GetEndはboost::begin/endだと駄目なのか?
2. VC++なら、参照型を使わない限り大抵#define BOOST_FOREACH(e, c) for each (e in (c))で良いはずだが?
参照型を使いたいんだという異論は認める。
boost::spiritでURIを解析したいと思い、下のように書きました
HostName = *(DomainLabel >> ch_p('.')) >> TOPLABELp >> !ch_p('.');
DomainLabel = alnum_p | (alnum_p >> *(alnum_p | ch_p('-')) >> alnum_p);
TopLabel = alpha_p | (alpha_p >> *(alnum_p | ch_p('-')) >> alnum_p);
これだと、DomainLabelとTopLabelがそれぞれalpha_pとalnum_pに引っかかってしまうため、
それぞれ下のように書き直しました。
DomainLabel = alnum_p >> *((*ch_p('-') >> alnum_p) | alnum_p);
TopLabel = alpha_p >> *((*ch_p('-') >> alnum_p) | alnum_p);
この状態で、だいたいのマッチングは行えるのですが、
"com" '.'の部分がDomainLabelで判定されてしまい、
○www.google.com
×www.google.com.
となってしまいます。
どう書き換えればうまくマッチングを行えますか?
/やeofのチェックを追加するとか
>>855 A1:どうせ短いコードだし、boost無しでやりたかったので
A2:VCにfor eachが追加されてたのを知らなかったorz
for eachだと読み取りのみなのか。
>参照型を使いたいんだという異論は認める。
ってのは、そこのことか。
>>857 ありがとうございます。
>>856はURIパーサの一部で、/までチェックしてしまうと
パスのチェックがうまく働かなくなってしまいますので、できません。
>>856 HostName = *(DomainLabel >> ch_p('.')) >> !DomainLabel;
DomainLabel = alnum_p >> *((*ch_p('-') >> alnum_p) | alnum_p);
>>856 HostName = *(DomainLabel >> ch_p('.') >> eps_p(anychar_p)) >> TOPLABELp >> !ch_p('.');
としたらどうだろう?
ピリオドの後に1文字も無ければDomainLabelのほうでマッチしないようにしたつもりなんだけど。
たびたび済みません。
>>862でのeps_pがヒントとなり解決出来ました。
HostName = DomainLoop >> TopLabel >> !ch_p('.');
DomainLoop = *(DomainLabel >> ch_p('.') >> eps_p(DomainLabel));
としたところ、うまくいきました。
pool は固定サイズのオブジェクトの割り当てですが、
可変サイズのオブジェクトの割り当てを行うものはないでしょうか?
apache portable library の pool に相当するような感じで
解放のタイミングが明確 (割り当てたオブジェクトがいっせいに必要なくなる)
ような処理におけるメモリ割り当てを高速化したいのですが
自分でアロケータ作っちゃえば?
関数から new したポインタを返すとき、その呼び出し元が
shared_ptr に入れて使うか scoped_ptr に入れて使うかわからないとき、
どうしたらいいかな?
生で new/delete すると例外安全にするのが面倒だし、
auto_ptr で返すと shared_ptr には渡せても scoped_ptr に渡せないんだよね。
なんで auto_ptr を scoped_ptr に変換できないの?
渡す方法ある?
ごめんできるね。ドキュメントの最初のページだけ見て見逃してた
870 :
デフォルトの名無しさん:2008/12/20(土) 16:05:27
科学技術関連のシミュレータを作ってて、
コアの部分をC++のスタティックライブラリで、
GUIをC++/CLI & WinFormで作ってる。
<boots/thread.hpp>をincludeすると、
GUIの方で以下のエラーが出る。
> エラー 31 fatal error LNK1104: ファイル 'libboost_thread-vc80-mt-gd-1_34_1.lib' を開くことができません。
boost thread以外(boost/randomとかboost/mathとか)は普通に使えてるし、なんでだろう?
ちなみにスタティックライブラリの方はコンパイルできてるから、CLIとの相性とかそこら辺を疑ってるんだけど…
Windows XP SP3
VC8.0 (VS2005)
boost 1.36.0
Boost ThreadはVS8.0用を全部インストールしてる(Multithread Debug DLL, Multithread DLL, Multithread, Multithread Debug)
>>870 プログラミングのど素人かどうかは、エラーに対処できるかどうかで
だいたい判ってしまうな。
ライブラリ探索パスに、'libboost_thread-vc80-mt-gd-1_34_1.lib'が存在
するパスが登録されていなくて、リンカがライブラリを見つけられないか、
そもそも'libboost_thread-vc80-mt-gd-1_34_1.lib'ファイル自体が存在
していないから、そういうエラーメッセージが出る。
>>871 この糞質問だらけの板でまともに自分の状況を記述して質問をできることに俺は素直に感心したがな
>>870 >boost thread以外(boost/randomとかboost/mathとか)は普通に使えてるし、なんでだろう?
randomとかmathはヘッダで完結していて.libを必要としないライブラリだからね。
原因は多分
>>871の通り。
Tools -> Options -> Projects and Solutions -> VC++ Directories -> Library Files
に、libboost-なんちゃらのあるディレクトリを指定する。
今手元に英語版しかないので日本語版でどんな名前になってるかはわからん。
ん、失礼。 早とちりかも。
>ちなみにスタティックライブラリの方はコンパイルできてるから
ここよくわからん。 もう少し詳しく解説希望。
特にBoost.threadをスタティックリンクするのかVCランタイムをスタティックリンクするのかの区別を。。。
874 :
870:2008/12/20(土) 16:35:14
レスサンクス
>>.871
ライブラリファイルのディレクトリにパスは通してますが、それでもダメ。
(こちらの環境だと C:\Program Files\boost\boost_1_36_0\lib )
あとエラーメッセージで無いよって言われているのが libboost_thread-vc80-mt-gd-1_34_1.lib なのかも謎…
1.36.0使ってるんだから、libboost_thread-vc80-mt-gd-1_36.libになるんじゃないのかなと。
過去に1.34.1入れたこともないし、うーん…?
>>872-873 1つのソリューションに
・my_core (スタティックライブラリ,C++)
・my_gui (C++/CLI & WinForm)
という2つのプロジェクトが入ってて、my_guiからmy_coreをリンクしてる
boostはmy_coreの方で使ってる(my_guiの方からはリンクしてない)んだけど、
コンパイルエラーが出るのはmy_guiの方なのが不思議,といった感じ
ググってたらC++/CLIじゃboost threadうごかねぇ!っていう書き込み見つけたんだけど、この人はC++/CLIから直接boost threadをリンクしてるみたいだから、ちょっと条件が違う気もする…
ttp://g-1.blog.so-net.ne.jp/2008-05-26
インクルードしてるboostが1.34でオートリンクが古いライブラリ名になってる。
ライブラリパスだけ更新してインクルードパスが古いままとかじゃない?
>>874 リンカに直接libboost-(略)を指定してるわけじゃないんだよね?
今のboost::threadって、インクルードすると勝手に#pragmaでリンクする仕様だったっけ?
>>875 そもそも1.34.1はインストールしたことないから、古い方をインクルードしてるってことは無い…はず…
(VS2005の設定でも、C:\Program Files\boost\boost_1_36_0 を指定してるし)
でもリンカが1.34.1をリンクしようとしてるってことは、1.34.1がどっかに入ってるってことだよね…
今使ってるマシンはインテルコンパイラやら市販のライブラリやらいっぱい入ってるんで、その影響かも?
とりあえず真っ新なマシンにVS2005とboost入れて試してみる
>>876 .libはまだ何も指定していない
( #include <boost/thread.hpp> を指定しただけの状態)
878 :
デフォルトの名無しさん:2008/12/20(土) 17:29:20
boost付けてスピードアップだ
bjamとかでビルドしたら深い階層にライブラリ作られたりする(1.37.0では)
パスディレクトリの直下に.libファイルないといけないんじゃないの?
>>879 今はそういう問題じゃないたぶん
>>877 BOOST_LIB_VERSIONってマクロが<boost/version.hpp>にあって、
thread.hppが自動リンクする場合はそれを参照しているはずなんだ。
ためしに↓をコンパイル・実行してみてくれない?
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
int main() { cout << BOOST_LIB_VESION << endl; }
881 :
871:2008/12/20(土) 19:37:14
boost 1.36をWebインストールした際、VC++6.0用のライブラリがビルド
されていなかったんで、同梱のmakeファイルでビルドしたら、バージョン
は忘れたが、古いlibが生成されて似たようなエラーが出た記憶がある。
調べたら、makeファイル内部に記述されたバージョンが古いままだった
ので、テキストエディタで置換して再ビルドし直した。
この手のオープン系でいつも思うんだが、バージョンアップでデグレード
もしょっちゅうだし、何をどこまでテストしてリリースしているのか知らん
けど、たぶん他のVC++用もおそらく同じような状況なんじゃないの?
#pragmaのライブラリ指定はboost側のインクルードファイル内に記述が
あるんだと思われ。最近のDirectXなんかもそんな感じ(ソース内やリンカ
への直接指定が不要)になっているようだ。
882 :
870:2008/12/21(日) 01:17:51
レスありがと
>>880 なるほど。
試して報告する
(週明けになっちゃうかも)
>>881 プロジェクトごとにいちいちlibファイル指定する手間は省けるけど、
肝心のマクロの出来がアレだと、逆にトラブルの元…ってことなのかな
(こっちの開発環境のせいって可能性も十分あり得るから、何とも言えないけど)
883 :
870:2008/12/21(日) 12:34:55
>>880 >>881 #include <boost/version.hpp> にしてやってみた
(#include <boost/thread.hpp> の時点でコンパイルエラーになっちゃうので)
BOOST_VERSION 103401
BOOST_LIB_VERSION 1_34_1
でも C:\Program Files\boost\boost_1_36_0\boost\version.hpp では
#define BOOST_VERSION 103600
#define BOOST_LIB_VERSION "1_36"
になってるから、C:\Program Files\boost\boost_1_36_0\boost\version.hpp じゃなくてどこか別の所にあ るboost をincludeしちゃってるみたい。
884 :
870:2008/12/21(日) 12:35:31
(続き)
試しに真っ新なWindows XPにVS2005、boost 1.36.0だけ入れて試してみたら…
BOOST_VERSION 103600
BOOST_LIB_VERSION 1_36
と、正常。
(#include (boost/thread.hpp> もコンパイル通る。)
というわけで、
他のライブラリの内部で boost 1.34.1 使っているせいだということが判明。
(インテルコンパイラやら数値計算ライブラリやら使ってるので、まだどのライブラリが原因かは突き止めてないんだけど)
つまり悪いのはboostじゃなくて、こちらの環境でした。
レスくれた方々ありがとう。お騒がせしました。
cygwinをフルインストールしててそっちのboostが引っかかってるのかと思ったが違ったみたいだな
struct Hoge { virtual ~Hoge() = 0; };
struct C : std::binary_function<Hoge, Hoge, bool> { bool operator()(const Hoge& lhs, const Hoge& rhs) const; };
としたときに,
boost::result_of<C(Hoge, Hoge)>::type;
と戻り値を得ようとすると,
"error C2027: 認識できない型 'boost::result_of<F>' が使われています。"
とエラーが出てしまいます.
Hoge が抽象クラスでないか,あるいは
boost::result_of<C(const Hoge&, const Hoge&)>::type;
とすればよいのですが,ライブラリ側(boost::ptr_list::sort)が
boost::result_of<C(Hoge, Hoge)>::type;
として呼び出してしまっているのでこのような変更はできません.
このようなときにはboost::result_ofを特殊化するしか方法はないのでしょうか?
それとも何かやりかたが間違っているのでしょうか?教えてください.
***次のコードでこの問題が発生します***
struct C { virtual void f() = 0; };
struct D : C { void f() {} };
struct compare : std::binary_function<C, C, bool> {
bool operator()(const C& lhs, const C& rhs) const {
return false;
}
};
boost::ptr_list<C> list;
list.sort(compare());
SVNが遅いって過去スレに似たような現象なかったっけ
ぶっちゃけsvnはどうあがいても遅い上に負担がかかるので、
>>865の人みたいに定期的にzipで上げてもらったものを落とすのがむこうもこっちも一番いい。
gitとbzrによるcloneもあります。
分散型が好きな人ならどうぞ。
gitは下のリンクを参考にしてください。
毎日ちゃんとfollowされてます。
本体のコミット権がある人はコミットもできるみたい。
ttp://www.nabble.com/git-svn-conversion-td17677096.html bzrはtrunk, releaseのブランチのみlaunchpadにあります。
bzr clone lp:~rigarash/boost/trunk
bzr clone lp:~rigarash/boost/release
でとれるはず。
>>886 std::bynary_function<const C&, const C&, bool>
ではだめなの?
892 :
887:2008/12/24(水) 20:43:25
>>888-890 原因判明。
>df
/dev/ (中略) 100%
(以下略)
\(^o^)/
vmware playerの容量の増やし方わかんないしー
proto使いたかっただけなんだけど、protoだけダウンロードしてきてboost以下に置いてもなんかいろいろ足りないみたいで、
じゃあ全部入れるかと思ったんだけど、むぅ。
signalのoperator()を繰り返し呼び出している途中で、関数オブジェクトを新たにconnectしたりdisconnectする使い方を思いついたんですけど、
こういう使い方って、signalの本来の目的とはズレてますか?
shared_ptr には deleter を登録できるのに、scoped_ptr にはできない。
なぜ?何か理由がある?
deleterを使うには余計なポインタとnewとtryが必要になるからじゃないか
scoped_ptrで十分なシチュエーションでも、deleter を使いたかったら shared_ptrに
しろってことかな
C++0xのunique_ptrはdeleterを指定できるみたい。
>>899 あれはテンプレート引数にデリータの型を入れる方法になってるね。
default_delete の場合は特殊化してポインタだけで済ませるんだろう。
昨日質問スレに書いたけどコードミスってたせいで流されたから
すまんけどこっちできかせてください
boost::shared_ptr< X > X::Add( boost::shared_ptr< X > x ) {
vec.push_back( x ) ;
return boost::shared_ptr< X >( x ) ;
}
int main(){
boost::shared_ptr< X > x1( new X ) ;
boost::shared_ptr< X > x2( new X ) ;
boost::shared_ptr< X > x3( new X ) ;
x1->Add( x2 ) ; ※
x1->Add( x3 ) ;
}
とやりたいんだけど、これだと※の時点でx1の文が終わった時点で
x1の参照カウントがゼロになってデリートされちゃいます。
Addの引数と戻り値はこのままでうまいことやる方法はありませんか?
?
※の時点ではまだx1,x2,x3のshared_ptrは生きているのでは…?
最適化はoffになってるよね?
904 :
901:2008/12/30(火) 18:12:12
>>902 日本語変でした
※の文が終わるときにx1のデストラクタが呼ばれます
なのでその次の
x1->Add( x3 ) ;
を呼ぶときにx1が正しくないため落ちます
>>903 すいません今すぐは確認できません
落ちねえよ
なんてコンパイラ使ってるんだ?
落ちたの?最適化onでステップ実行やらブレークがかからないまま正常に実行が終了したんじゃないかと。
907 :
901:2008/12/30(火) 18:23:57
>>905 VS2005です
デストラクタが呼ばれることは確認しました
>>906 落ちましたね
ステップ実行もしました
落ちねーよw
お前の方で見直さない限り俺たちには何も言えないから。
shared_ptrはgetやresetを誤用しなければそうそうおかしな事にはならないはずだけどなあ
問題が再現する最小限のコードを晒してもらわないと何とも言えないな
911 :
901:2008/12/30(火) 18:42:34
Debugビルドだとさっきから言ってるところで落ちて
Releaseビルドだと落ちないけど期待された値になりません(vecのサイズがゼロ)
問題がなんなのかわからなくなってきました。すみません。
以下コード
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
class X ;
typedef boost::shared_ptr< X > sp_X ;
class X {
public :
sp_X Add( sp_X x ) { vec.push_back( x ) ; return sp_X( this ) ; }
~X() { std::cout << "destructed" << std::endl ; }
void Show() { std::cout << vec.size() << std::endl ; }
private :
std::vector< sp_X > vec ; } ;
int main() {
sp_X x1( new X ) ;
sp_X x2( new X ) ;
sp_X x3( new X ) ;
x1->Add( x2 ) ;
x1->Show() ;
x1->Add( x3 ) ;
x1->Show() ;
}
実行結果
destructed
0
destructed
0
destructed
destructed
>>911 おそらくreturn sp_X( this ) ;がいけない。
こういうことがやりたければ、enable_shared_from_this使え。
sp_X( this )
これがダメ
shared_ptrのコンストラクタには基本的に new した直後のポインタか、
既に正しく生成されたshared_ptrのインスタンスしか渡しちゃダメ
二重deleteで何が起こってもおかしくない
914 :
901:2008/12/30(火) 18:54:37
>>912 できました!
そこが怪しいとは思いましたが…そんなのがあるんですね。
勉強になりました。
他の方々もどうもありがとうございました。
>>913 基本的にはそうしていましたが、thisを戻したいときどうすれば、と悩んでいました。
とにかくありがとうございます。
ptr_vector などの ptr_ 系のコンテナって、
メモリの再確保やノード生成時にメモリが足りなくて例外投げた際に
入れようとしたオブジェクトのメモリはリークするのですかしないのですか。
例えば、
boost::ptr_vector<int> v;
v.push_back(new int(2));
としたとき、new int が成功したけど
push_back する際のメモリ確保に失敗した場合に、
new int のメモリはリークする?
ptr_container のソースってマクロで読みにくいし・・・
しないと思うけど、ソース見れば
わざわざ auto_ptr 渡すバージョンを作ったくらいだから
リークすんじゃね?
ptr_containerのアロケートのところに例外しこんで
実験すればいいじゃん
お前頭いいな。
>>921 auto_ptrは便宜上だろ。別にリークするからじゃない
ソース読まなくてもドキュメント読めば書いてあるのでは?
lispのgensymに相当するものってないのでしょうか?
926乙
乙
ありがとう
931 :
デフォルトの名無しさん:2009/01/03(土) 05:49:46
乙age
932 :
デフォルトの名無しさん:2009/01/04(日) 17:03:45
MFCのクラスにある関数を
thread SS(&StartShread);
として渡したんですが、
error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
とエラーが出てしまいます。Threadにはどういう形で渡せばいいんでしょうか?
ちょっとMFCの質問気味かもしれませんがお願いします。
普通だったらhoge.StartShread()と呼ぶんだから、hogeの部分も渡さないとだめよ。
thread SS(boost::bind(&クラス名::StartShread, boost::ref(hoge)));
refを付けているのは、直接hogeを渡すとそのコピーが作られてそっちのStartShreadが呼ばれるため。
代わりに、hogeが自動変数ならスレッドが終わる前にhogeが死ぬことのないように気を付けろ。
thread SS(boost::bind(&クラス::StartShread, インスタンス, 〜));
ありがとうございます。コンパイルできました!
最近実測して気がついたんだけど、bindした関数の呼び出しって
生関数ポインタの呼び出しに比べて4〜5倍遅くなるのね。
当たり前やがな
むしろ4〜5倍で済むんだ?という感じ。
大体関数ポインタを二個挟んで呼び出すのと同等らしい
2回分で2〜3倍くらいの時間ならまぁそんなもんかと
思ったんだろうが、5倍超えるとなるとちょっと萎える。
あとfunctionのみでもbindと同じくらい遅くなるんだよね。
ただしfunctionにbindした関数を入れた場合でも、
さらに大幅に遅くなったりはしないのが不思議だった。
関数呼び出し単体の時間差を測っても意味無いだろ。
10ns が 50ns になったからって、関数本体の処理が 10us あったらボトルネックにはなり得ない。
いやなりえる。
具体的にはエミュレーターとか仮想マシンのオペコードの処理が
関数ポインタの配列になってた部分を、function+bindに変えたらなった。
>>941 ちっとも具体的じゃないんだけど、その関数の処理は>940の書いている通り10usも掛かっていたのか?
あーすまん。ちゃんと読んでなかった
946 :
デフォルトの名無しさん:2009/01/07(水) 18:06:44
宣伝
mpl::apply_ifが使えなかったので1.32から1.37にアップグレードしてみました。
結果version.hppの中で#define BOOST_VERSIONが10370になったのですが、やっぱりmpl/apply_if.hppが見あたりません。
grepで探してもapply_ifが見あたらないのですが、apply_ifは何をインクルードすれば使えるのでしょうか。
ありがとうございます。
952 :
デフォルトの名無しさん:2009/01/10(土) 11:30:14
953 :
デフォルトの名無しさん:2009/01/10(土) 11:40:36
乙951
954 :
デフォルトの名無しさん:2009/01/10(土) 17:00:40
regex_searchで、後ろから逆順に検索する方法ってありますか?
さっきからreverse iterator使ってみてるんですが、
boost::regex reg("[0-9a-zA-Z]");
boost::match_results<std::string::iterator> results;
regex_search(str.rend(), str.rbegin(), results, reg);
て事ですよね、なんかコンパイル通らなくて・・・て思ったら
boost::match_results<std::string::iterator> results;
ぢゃなくて
boost::match_results<std::string::reverse_iterator> results;
だった・・・。こんな事で1時間はまるとは・・・・・orz
ありがとうorz
reverse iteratorだと1文字のものしかマッチしないんじゃないの?
wchar_t
lambdaの実装を眺めていて変態だというのはわかったのですが、気になったことがあるので教えてください。
たとえば_1+3とか書くとlambda_functorの中でplus_actionが呼ばれるように理解しましたが、
これは要するに、コンパイラが+演算子を適用する代わりにplus_actionというファンクタを勝手に呼び出してくれてるということですよね。
ということは、(_1%2)*2みたいに書くと二段階にファンクタを呼ぶ=関数ポインタを二回探しに行くという理解で正しいでしょうか?
もしそうならpod型なんかが相手だともったいないと思うのですが、コンパイル時の最適化で吸収してくれてたりするのでしょうか。
なんだか書いていてスレ違いなんじゃないかって気もしてきましたが、よろしくお願いします。
>>959 最適化してくれるかどうかなんてコンパイラ依存だろう。
特定の実装について知りたいなら試せばいい。
うむむ、なるほど。たしかに言われてみればコンパイラ依存が大きそうな感じですね。
デバッガの使い方いまいち理解できてないんですが、簡単なコードで奮闘してみます。ありがとうございました。
962 :
デフォルトの名無しさん:2009/01/12(月) 16:15:24
1.36のserializer腐ってないか?
具体的に
964 :
デフォルトの名無しさん:2009/01/12(月) 17:53:09
BOOST_CLASS_EXPORTを使うと、C2371エラーがでまくる
アホだろこれ
ソースを晒せ。
話はそれからだ
966 :
デフォルトの名無しさん:2009/01/12(月) 18:28:08
まあ、たとえばこんな感じでFooを継承したクラスを複数作ったんだが
「error C2371: '`anonymous-namespace'::boost_serialization_guid_initializer_23' : 再定義されています。異なる基本型です。」
とエラーが出るんだよ。ウンコだ
//////////////////////////////////
// Bar.h 派生
#include <boost/serialization/base_object.hpp>
class Bar : public Foo
{
public:
Bar(void);
~Bar(void);
private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & boost::serialization::base_object<Foo>(*this) ;
}
} ;
BOOST_CLASS_EXPORT( Bar ) ;
967 :
デフォルトの名無しさん:2009/01/12(月) 18:28:45
ちなみに基底はこれ
//////////////////////////////////
// Foo.h 基底
class Foo
{
private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & m_hoge ;
}
} ;
968 :
デフォルトの名無しさん:2009/01/12(月) 19:21:18
自己解決した。
実装をcppのほうに移したらコンパイルが通った。
おまえがうんこだったんだろ
boost::bind について教えてください
int func(int n1,int n2){
return n1 + n2;
}
std::tr1::function<int(int)> pFunc;
pFunc = bind(&func,20,_1)
↑これは出来るのですが
pFunc = bind(&func,20,_2)
↑これが出来ません。
第二引数を固定するbindはどう記述すればよいでしょうか?
971 :
デフォルトの名無しさん:2009/01/15(木) 10:42:16
>>970 根本的に間違って覚えてないか?
pFunc = bind(&func,_1,20);
でやってみ
972 :
デフォルトの名無しさん:2009/01/15(木) 12:43:44
_1 や _2 はbindが返した関数オブジェクトの何番目の引数かってこと
突っ込まれるのが恐い・・・・
やらないか?
974 :
デフォルトの名無しさん:2009/01/15(木) 21:23:03
なにを?
977 :
デフォルトの名無しさん:2009/01/16(金) 09:12:28
981 :
980:2009/01/17(土) 16:14:37
反応無いな……マルチメソッドには興味無いのかな。
上記をポリシーベースに分割してみました。
誰かトランポリン関数の上手い処理の仕方を教えてくれぇ……
shared_ptrでカスタムデリータを使おうと思うのですが、デリータの指定を忘れないようにデストラクタをprotectedにして罠をかけました。
でも、派生させるとデストラクタがpublicになってしまうので罠を素通りしてしまいます。deleter指定を忘れないいいようにする方法はありませんか。
#include <boost/shared_ptr.hpp>
using namespace boost;
class Disposable
{
protected:
virtual ~Disposable(){}
virtual void Dispose(){}
public:
static void deleter(Disposable* Obj)
{
Obj->Dispose();
delete Obj;
}
};
class Disposable2 :public Disposable{};
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Disposable> a1(new Disposable(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a2(new Disposable());//エラーになる ok
shared_ptr<Disposable> a3(new Disposable2(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a4(new Disposable2());//エラーにならない。bad !!!!!!!
Disposable a5;//エラーになる ok
return 0;
}
983 :
980:2009/01/17(土) 23:27:08
>982
一番簡単なのは、生でコンストラクトするのは禁止して必ずcreate関数で拵えるようにするのじゃない?
class Disposable {
protected:
void Dispose(){};
~Disposable(){};
struct Deleter {
template<typename T> void operator()(T* target) {
target->Dispose();
delete target;
};
};
public:
static shared_ptr<Disposable> create() {
return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
};
};
class Disposable2 : public Disposable {
public:
static shared_ptr<Disposable2> create() {
return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
};
};
ちょっと修正
class Disposable {
protected:
Disposable(){};
~Disposable(){};
void Dispose(){};
struct Deleter {
template<typename T> void operator()(T* target) {
target->Dispose();
delete target;
};
};
public:
static shared_ptr<Disposable> create() {
return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
};
};
class Disposable2 : public Disposable {
private:
Disposable2(){};
~Disposable2(){};
public:
static shared_ptr<Disposable2> create() {
return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
};
};
Disposableを抽象クラスにしないのはなんか気になるなぁ……
なるほど、createを使ってdeleterを隠蔽するのか。1箇所のクラスの定義でcreateの実装を忘れなければ、多数のインスタンスを作るところでミスらないから問題ないってことですね。
そうそう >985
各クラスでcreateを実装し忘れると痛い目に会うけど、newする毎に気を付けるよりはよっぽどマシ。
createをテンプレート関数にして基底クラスに判定用のメンバ突っ込んで
delete時にcreateを通してないかチェックできるようにすれば多少安全になるんでは