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

Boostを語れゴラァ part5

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

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

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

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

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

boost info
http://shinh.skr.jp/boost/
0192デフォルトの名無しさん2007/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
みたいにしないとだめだよねぇ?
0193デフォルトの名無しさん2007/12/17(月) 10:40:42
http://www.boost.org/libs/serialization/example/demo_shared_ptr.cpp
ここには基底クラス 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 を生成してから毎回登録するのは
忘れてしまいがちなので。
01941932007/12/17(月) 11:14:31
というか、register_type で何を登録すればいいのかがわからん。
http://archives.free.net.ph/message/20071129.235833.ba9e02a9.en.html
でまさしく同じ問題についてQ&Aがあるんだけど、
結局上の URL の例をみろってことだけなんだよなぁ。
01951932007/12/17(月) 11:24:03
http://pastebin.windy.cx/?page=view&id=1197858127
どうやらこれだけでいいみたい。
でも文字化けしてしまった…

#そのうち他言語対応しておきます。
01961932007/12/17(月) 11:25:44
他言語→多言語 orz
しかも sage てなかった orz-----3
0197デフォルトの名無しさん2007/12/17(月) 16:56:24
Boost と POCO ってなかよしなの?
asio とか filesystem とかかぶってるみたいだけど.
0198デフォルトの名無しさん2007/12/18(火) 13:34:06
VS 2008 EE 日本語版
0199デフォルトの名無しさん2007/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の仕様として
保障されてますか?
0200デフォルトの名無しさん2007/12/18(火) 18:09:44
はい
0201デフォルトの名無しさん2007/12/18(火) 18:12:42
thx
0202デフォルトの名無しさん2007/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 コンソールアプリケーションです。
02032022007/12/21(金) 00:44:29
自己解決しました。
0204デフォルトの名無しさん2007/12/21(金) 00:54:37
わざわざ通知ありがとうございました。
0205デフォルトの名無しさん2007/12/21(金) 12:42:34
boost::bind(&ClassA::MethodB, this, _1)

みたいなファンクタを生成するとき,ClassA に MethodB
が複数 (void MethodB(int) と void MethodB(double)とか)
定義されていたら,どちらのメンバ関数ポインタになるんでしょうか?
0206デフォルトの名無しさん2007/12/21(金) 12:57:01
内輪で使うために作ったWindows版のバイナリパッケージを晒します.
ビルド環境
Visual Studio 2005 Professional SP1 日本語版
Visual C++ 2008 Express Edition 英語版

vc8 と vc9 でビルドするスクリプト
http://svn.windy.cx/websvn/listing.php?repname=Building.boost-trunk&path=%2F&sc=0

trunk の Windows 用インストーラつきバイナリパッケージ
C:\Program Files\boost\boost_1.35_20071202 以下に展開されます
アンインストールはディレクトリごと削除するだけ

ヘッダ(共通)
http://svn.windy.cx/index.php?plugin=attach&refer=SVN.WINDY.CX&openfile=boost_1_35_20071202-header.exe
vc8用スタティック
http://svn.windy.cx/pub/boost_1_35_20071202-vc8.exe
vc8用DLL
http://svn.windy.cx/index.php?plugin=attach&refer=SVN.WINDY.CX&openfile=boost_1_35_20071202-vc8-dll.exe
vc9用スタティック
http://svn.windy.cx/pub/boost_1_35_20071202-vc9.exe
vc9用DLL
http://svn.windy.cx/index.php?plugin=attach&refer=SVN.WINDY.CX&openfile=boost_1_35_20071202-vc9-dll.exe

自分はスタティックライブラリしか使わないのでDLL版の動作は未検証.
GMP, MPFR, MPFR++ などのバイナリパッケージも.
http://svn.windy.cx/
02072052007/12/21(金) 13:06:06
パッケージは exe だけど,実体は自己展開 cab なので
拡張子を cab に変えればたいていのアーカイバで開けます.
あと,ランタイムに関してですが /MD と /MDd です.
02082062007/12/21(金) 13:06:56
名前欄間違えた.
0209デフォルトの名無しさん2007/12/21(金) 18:17:17
>>205
static_cast<void (ClassA::*)(int)>(&ClassA::MethodB)
みたいに明示的にキャストしないと通らないと思った。
0210デフォルトの名無しさん2007/12/21(金) 19:11:54
>>209
               ∩
               ( ⌒)     ∩_ _
              /,. ノ     i .,,E)
             ./ /"    / /" .
   _n  グッジョブ!! ./ /_、_   / ノ'    
  ( l    _、_   / / ,_ノ` )/ /_、_    グッジョブ!!
   \ \ ( <_,` )(       /( ,_ノ` )      n
     ヽ___ ̄ ̄ ノ ヽ     |  ̄     \    ( E)
       /    /   \   ヽフ    / ヽ ヽ_//

VC9用をいただきました
02112102007/12/21(金) 19:13:04
間違えた
>>209 ×
>>206 ○
0212デフォルトの名無しさん2007/12/23(日) 16:13:54
正規表現で調べる文字列にcharやwchar_tの配列は使用できないのでしょうか
0213デフォルトの名無しさん2007/12/23(日) 17:06:19
>>212
char*やイテレータを取るバージョンがあるはずだが
0214デフォルトの名無しさん2007/12/23(日) 18:15:20
>>213
以前のバージョンということですか?
できればxpressiveで書きたいので、最近のバージョンを使いたいのですが
それでは無理ってことでしょうか
0215デフォルトの名無しさん2007/12/23(日) 18:34:45
バージョンと言うかオーバーロードな
と言うかリファレンス見たら?
0216デフォルトの名無しさん2007/12/23(日) 22:54:20
>>215
つ 特殊化
0217デフォルトの名無しさん2007/12/23(日) 23:22:28
つか入力にイテレータ取るバージョンがあれば当然ポインタ食わせられるだろ。
0218デフォルトの名無しさん2007/12/23(日) 23:55:17
sregexがstd::string版なら、cregexがconst char*版。
Xpressiveでは、イテレータの型をテンプレート引数で指定する。
http://boost.org/doc/html/xpressive/reference.html#header.boost.xpressive.xpressive_fwd.hpp
0219デフォルトの名無しさん2007/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
と言われてコンパイルできません.
02202192007/12/24(月) 08:54:23
boost::bind に関するこのコードでなぜ最後のコメント部分の
コンパイルが通らないのでしょうか?
http://pastebin.windy.cx/?page=view&id=1198454028
0221デフォルトの名無しさん2007/12/24(月) 09:25:58
コンパイルできない理由はちょっとわからんけど、これじゃダメなん?
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout));
0222デフォルトの名無しさん2007/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));
0223デフォルトの名無しさん2007/12/24(月) 09:43:23
>>219
intを出力するoperator <<は、cout (std::basic_ostream)のメンバ関数だから、
そのコードでは、正しいoperator <<へ辿り着けない。
もっとも、それ以前の問題でコンパイルエラーになっているようだが。

今回は221のいうとおりostream_iteratorもあるし、
その他演算子一般の場合は、bind使えなくてもlambdaがある。
02242192007/12/24(月) 09:48:19
>>221
いや,もちろんそれでやりたいこととしてはOKなんですが,
一般的な演算子を指定できれば応用範囲も広がるかなと思って.

>>222
VC9 だとテンプレートを検索しまくって
「あれでもない,これでもない」と C2780 を連発した揚句,
時々 ambiguous だというエラーも出るんですよ.

なるほど, g++ でもそのままでは通らなくて,
static_cast すれば通るんですね. operator() だと問題なくて
operator= だと問題になる理由がわからないですが.
既定の代入演算子が別途用意されてしまうからかなぁ.
自前で = をオーバーロードした時って既定の = は
定義されないんでしたっけ?

でも独自にコンストラクタを作ってもコピーコンストラクタは
勝手に作られていたような気がする.
02252192007/12/24(月) 09:51:05
>>223
なるほど,それで operator<< が見つからないと怒られてるんですね.
たぶんグローバル名前空間の operator<< を探しに行って「無い」
と怒ってるように思います.

自分はてっきりストリームの << 演算子はグローバル名前空間に
定義されていて必要なクラスに friend 指定されているのだと
思っていました.
0226デフォルトの名無しさん2007/12/24(月) 11:35:14
>>224
boost::bindはlambdaと違って一旦メンバーポインタにするから。
だからoverloadされてるとまずい。
0227デフォルトの名無しさん2007/12/24(月) 13:22:18
--------------------------------------------------------
以下抜粋
bool A::foo(int) const;
A a;
vector<int> ints;
...
find_if(ints.begin(), ints.end(), bind(&A::foo, a, _1));
find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
---------------------------------------------------------

この形式でboost::lambda:bindを使う場合、非constメンバー関数を
指定するとコンパイルが失敗するのですが、constメンバー
関数しか渡せないという仕様なのでしょうか?

試したのはVC++ 2008です。以下がエラー内容です。
error C2665: 'boost::lambda::function_adaptor<Func>::apply' : 2
オーバーロードのどれも、すべての引数の型を変換できませんでした
02282192007/12/24(月) 14:12:29
>>227
find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
で,a が const じゃないからじゃね?
間違ってたらごめんne
0229デフォルトの名無しさん2007/12/24(月) 14:12:53
うぉ,名前付けてしもうた.
0230デフォルトの名無しさん2007/12/24(月) 16:45:33
>>228
find_if(ints.begin(), ints.end(), bind(&A::foo, a, _1));
参照渡しのこちらの形式で制限があることが記載されていました。
aはconstオブジェクトとしてファンクタに保持されるらしいので
constメンバー関数しか呼べないみたいです。回避策として
ref(a)を渡せばよいらしく、これでうまくいきました。

ポインタ形式のほうはポインタのコピーなので問題ありません。
find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
0231デフォルトの名無しさん2007/12/24(月) 21:32:02
boost::tuples::tuple<T1,T2,...> を投入して,
T1 をキーとして扱ってくれる map ってないものでしょうか?
std::for_each で処理する時,std::pair<Key, Value> の
インスタンスが順にファンクタに渡されますが,
そうではなくて Value だけを次々と渡してほしいので,
boost::tuples::get<1> などで値が取り出せる tuples が
便利なのですが・・・

boost::multi_index がそれに該当するのでしょうか?
0232デフォルトの名無しさん2007/12/24(月) 21:35:57
T1部分だけで比較する関数オブジェクトを持たせたsetはどうだろう?
0233デフォルトの名無しさん2007/12/25(火) 19:03:30
struct A {

 template <typename Args>
  struct sig
  {
   //typedef ??? type;
  };

  int operator()(int x) const;

  void operator()(int x, int y) const;

};

lambda式で使うファンクタの定義で、上のように引数の数が違い、
かつ戻り値の型も違う複数の関数呼び出し演算子を定義したい場合、
sigでどのようにtypeを表現したらいいのでしょうか?
0234デフォルトの名無しさん2007/12/25(火) 19:08:48
boost::iostreams使ってるんだけど、

struct my_device {
 typedef char char_type;
 struct category : bidirectional_device_tag, closable_tag {};

 std::streamsize read( char_type *s, std::streamsize n ) {}
 std::streamsize write( const char_type *s, std::streamsize n ) {}
 void close( std::ios::openmode which = std::ios::in | std::ios::out ) {}
};

int main() {
 my_device dev;
 stream<my_device> ss( dev );

 ss.get();
 char ch;
 ss >> ch;
}

このとき、get()してるはずなのに、my_device::read()の引数nの値が
4096になっているのはなぜ??n=1で呼ばれて欲しいんだが。
operator >> を使った場合も同じくn=4096。

4096ってのは、バッファのサイズか何かだとは思うんだが・・・。
ソース見てもテンプレート使いまくりで、どこで呼び出してるのかさっぱりわからん。。。

誰かわかる人いる?
ちなみに環境はWinXP + VC8です。
0235デフォルトの名無しさん2007/12/25(火) 19:31:39
stream<my_device> ss( dev, 1 );

see also
ttp://www.boost.org/libs/iostreams/doc/index.html
0236デフォルトの名無しさん2007/12/25(火) 19:45:19
>>235
回答ありがとうございます。
バッファのサイズを1にするだけだと、上のコードは通りますが、

ss.read( buf, sizeof( buf ) );

みたいな使い方をするときに効率が悪い気がするんですが。
ほかにいい方法ありませんか?
0237デフォルトの名無しさん2007/12/25(火) 20:04:33
>>233
Argsを調べて適当にディスパッチしてやれば良い。例えば引数の数で分けるなら、
template <typename Args>
struct sig
{
  typedef typename boost::mpl::if_c<
    boost::tuples::length<Args>::value == 2, /* 関数オブジェクトと引数一つで合計2 */
    int,
    void>::type type;
};

試してないけど、typename Args::inheritedでconsリストを得て、
それに対して部分特殊化でパターンマッチすることもできるはず。
0238デフォルトの名無しさん2007/12/25(火) 20:24:53
>>236
my_device::readの引数nが4096でも戻り値で1を返しとけばいいんじゃないかな?

でもmy_device::readが一度に1しか読めない仕様(234より)だから
ss.read( buf, sizeof( buf ) )ってやるとsizeof(buf)回呼び出されて効率悪いけど・・・
0239デフォルトの名無しさん2007/12/25(火) 20:39:55
>>236
多分大丈夫だと思うんだけどmy_device::readの引数nがインデックスではないよ。サイズだよ?

例えばn==4096の時
  4096番目からreadしてsに入れろ
でなく
  わたくしめの方で確保させていただきましたsのサイズは4096です。
  4096ぴっちり埋めて頂かなくても結構ですが埋めて頂きましたサイズを戻り値としてお返しください
だよ?

インデックス指定はseekで行われるよ

see also
ttp://www.boost.org/libs/iostreams/doc/tutorial/container_device.html
0240デフォルトの名無しさん2007/12/25(火) 21:25:59
>>238-239
ありがとうございます。
my_device::read()の引数nがインデックスではないのは理解しているつもりです。

作っているmy_deviceがrs232cの通信インターフェースなので、
stream<my_device> ss;
ss.get();
のときに、タイムアウトするまで制御が戻ってこないと不都合があったのです。
※1文字受信していても、n==4096なので、ReadFileしたときに制御が戻ってこない

なので、
ss.read( buf, sizeof( buf ) );
のときにはsizeof( buf )分だけ、
ss.get()
のときには1文字分だけ読み込む処理がしたかったのです。

iostream拡張は今までやったことがなく、stream_bufのバッファリングの仕組みは
まだよくわかっていなのですが、仕様っぽい気がしてきました。

他の方法で解決できないか試してみます。
0241デフォルトの名無しさん2007/12/25(火) 21:58:08
>>237
レスありがとうございます。
mplやconsリストというのを未だ知らないので
まずはこれを調べて見ます。
02422342007/12/26(水) 00:00:09
自己解決しました。
my_device::read()内で、受信バッファのデータ数を調べ、
その分だけReadFileすることで解決しました。

>>235, >>238-239
助言ありがとうございました。
0243デフォルトの名無しさん2007/12/26(水) 00:01:29
struct A {

 template <typename Args>
  struct sig
  {
    typedef ?? type;   
  };

  int operator()(int x) const;
  double operator()(double) const;
  void operator()(int x, int y) const;

};

上のようなファンクタの場合、型の違いによって、
typeを振り分けるにはcons listから型を抽出して
is_same<>で型を判定するという方法で可能でしょうか?
sigの部分的特殊化の方法か何かで
Args::inherited が cons<A, double>
を表すように仕組んで、
boost::tuples::element<1, Args>::type
とcons<A, double>のdoubleの比較一致を
試すというようなことができれば実現できるのかなと
思っているのですが。
0244デフォルトの名無しさん2007/12/26(水) 05:38:45
>>243
ごめん、上でArgs::inheritedとか書いたけど無視してくれ
Argsがタプルならこの方法でconsリストを取り出せるけど、Argsとして渡されるのは最初からconsリストだった。

で、そのファンクタの場合も、boost::tuples::elementとis_sameとif_cでちまちまテストしてもいいし、
部分特殊化で一気にディスパッチしてもいい。
後者なら、メンバテンプレートは特殊化できないので、こんな感じで。

namespace detail {
  namespace bt = boost::tuples;
  template <typename Args> struct A_sig;

  template <typename Fun>
  struct A_sig<bt::cons<Fun, bt::cons<int, bt::null_type> > > { typedef int type; };
  template <typename Fun>
  struct A_sig<bt::cons<Fun, bt::cons<double, bt::null_type> > > { typedef double type; };
  template <typename Fun>
  struct A_sig<bt::cons<Fun, bt::cons<int, bt::cons<int, bt::null_type> > > > { typedef void type; };
}

struct A {
  template <typename Args>
  struct sig { typedef typename detail::A_sig<Args>::type type; };
/* 以下略 */
0245デフォルトの名無しさん2007/12/26(水) 09:10:49
std::ostringstream のインスタンス oss から
boost::archive::binary_oarchive bo(oss) として
bo にいろんなクラスを流し込んだ挙句,
oss.str() で std::string を取り出して
プログラム内でやり取りすることはできますか?

つまり,std::ostringstream にバイナリを
流し込んでいいのか?ということなんですが・・・
(その点に絞ると Boost スレとはスレ違いですみません)
0246デフォルトの名無しさん2007/12/26(水) 10:04:57
Boost にはガベコレの昨日は入らないんでしょうか?
Boehm GC に似たやつとか
0247デフォルトの名無しさん2007/12/26(水) 10:08:51
BoehmさんがWG21でやってる。
0248デフォルトの名無しさん2007/12/26(水) 12:23:05
>>247
今いくつか記事読んだ.
ライブラリとしてではなくて完全に言語使用に取り込もうとしているんだね.
C++/CLI の gcnew のように新しく「ハンドル」を持ち込むわけではないんだな.

ということは結局実装は Boehm GC のような conservative GC だってことだね.
0249デフォルトの名無しさん2007/12/26(水) 16:18:56
>>244
レスありがとうございます。
アイデアよくわかりました。この考えに従って
自作プログラムをコンパイルしたところ、引数が一つのもの
については成功し実行もできました。

//aはint配列あるいはdouble配列
for_each(a, a + 3, bl::bind(A(), bl::_1)); // OK

ただ、以下はコンパイルエラーとなりました。
//aはint配列
for_each(a, a + 3, bl::bind(A(), bl::_1, 100)); //コンパイルNG

引数が二つ以上のものが実体化されるときにエラーとなるようです。
”認識できない型”と怒られているので、おそらく
bt::cons<Fun, bt::cons<int, bt::cons<int, bt::null_type>が
実体化できない原因かなと思ってるのですが定かではありません。
consの形式自体はヘッドとテイルの2引数を与えていて、bl::null_type
も空の構造体として存在していましたので、型認識に問題は
なさそうなんですが、null_typeが連続して出てくるた
長い行が報告されます。(VC++ 2005 Eepress Edition)

boost::tuples::cons<const A,boost::tuples::cons<int,boost::tuples::cons<const
int,boost::tuples::detail::map_tuple_to_cons<boost::tuples::null_type,bo
ost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type
,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_t
ype,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::nul
l_type>::type>>>
0250デフォルトの名無しさん2007/12/26(水) 16:30:41
// Tuple to cons mapper ------------------------------------------------

// The empty tuple is a null_type
template <>
struct map_tuple_to_cons<null_type, null_type, null_type, null_type,
null_type, null_type, null_type, null_type, null_type, null_type>
{
 typedef null_type type;
};

ソースを見る限りではnull_typeと正しく判断されてもよいと
思うのですが。
0251デフォルトの名無しさん2007/12/26(水) 17:33:15
>>249
第二引数の型がintじゃなくてconst intとして与えられてるから特殊化にマッチしないみたいだ。
ディスパッチの前にremove_cvをかければ良いんだけど、
consリストはMPLシーケンスの要件を満たしていないみたいでtransformが使えない。
仕方ないから自分で再帰してみたら動いた。

template <typename List> struct list_remove_cv;
template <>
struct list_remove_cv<bt::null_type> { typedef bt::null_type type; };
template <typename Head, typename Tail>
struct list_remove_cv<bt::cons<Head, Tail> >
{
  typedef bt::cons<
    typename boost::remove_cv<Head>::type,
    typename list_remove_cv<Tail>::type
  > type;
};

これをやるくらいならelementとif_cで判別した方が楽かもしれない。
0252デフォルトの名無しさん2007/12/26(水) 17:57:56
もうphenixとか使った方がいいな
0253デフォルトの名無しさん2007/12/26(水) 18:25:33
>>251
毎度ありがとうございます。
難しいですね。。
自分ではまだそのようなコードは書けないです。
ただ、可能だということが分かっただけで
十分助かりました。引数型についてはelementで
引数の数についてはboost::tuples::lengthを使って
うまく組み合わせてみます。
0254デフォルトの名無しさん2007/12/26(水) 23:56:46
bjam を使って Visual C++ 用にビルドした場合,
ランタイムのリンク方法はどのようになるのでしょうか?
/MT & /MTd か /MD & /MDd のいずれなのでしょうか?
0255デフォルトの名無しさん2007/12/27(木) 00:01:26
>>254
オートリンクが、そのときの設定に合わせて自動でやってくれるので、
何もしなくてよい。
0256デフォルトの名無しさん2007/12/27(木) 00:18:37
/ML = -s
/MLd = -sgd
/MD = -mt-s
/MDd = -mt-s-gd
/MT = -mt
/MTd = -mt-gd
が全部用意されるのか・・・
/ML と /MLd は vc8 や vc9 ではすでにサポートされていないようなので
/MT と /MTd と同じものがビルドされているみたいだね.
0257デフォルトの名無しさん2007/12/27(木) 10:18:22
bjam 使ってビルドすると、たとえば
libboost_date_time-vc90-mt-gd-1_35.lib
libboost_date_time-vc90-mt-gd.lib
みたいにバージョンが入ったものとそうでないものが
ビルドされるけど、どちらか一方だけがリンカの
パスに見つかれば問題ないの?
それもオートリンクでどちらかが先に見つかって解決?
0258デフォルトの名無しさん2007/12/27(木) 10:39:45
名前マングリングの有無について設定するマクロがあったような…。
02592452007/12/27(木) 13:12:05
うぉ、std::string に binary_oarchive で流し込んで
持ち歩けることを確認、って当たり前かもしれないけど、
ちょっと感動。

make_nvp で作った std::pair をやり取りする
連想記憶(ってただの multimap だけど)を
作って便利に使ってます。

しかし boost::archive のフォーマットが変わるかもしれないので
ちゃんと serialize で version をチェックしなきゃなぁ、
バイナリだし何が起こるかわからない。
02602452007/12/28(金) 14:46:50
はまった(笑
制御文字を含むような std::string を boost::archive::xml_oarchive に
流し込むと XML 文書がぶっ壊れる.うむ〜.
0261デフォルトの名無しさん2007/12/28(金) 22:24:08
nifty規制解除キタ━━━━(゚∀゚)━━━━!!!
記念に糞patch晒し。
phoenixでstd::mapにoperator[]が使えなくて、渋々phoenix::binary_operatorを特殊化したら
boost::graph内(boost/graph/detail/read_graphviz_spirit.hpp)でも同じことやってるの見つけて
ブチ切れ気味にspecializations for stl iterators and containersとやらを修正してみた。

$ diff -u special_ops.hpp.orig special_ops.hpp
--- special_ops.hpp.orig 2007-12-25 10:49:20.000000000 +0900
+++ special_ops.hpp 2007-12-25 22:08:29.671875000 +0900
@@ -21,6 +21,8 @@
 ///////////////////////////////////////////////////////////////////////////////

 #include <boost/spirit/phoenix/operators.hpp>
 #include <iosfwd>
+#include <boost/typeof/typeof.hpp>
+#include <boost/utility/result_of.hpp>

 ///////////////////////////////////////////////////////////////////////////////

 #if defined(_STLPORT_VERSION) && defined(__STL_USE_OWN_NAMESPACE)
@@ -320,7 +322,8 @@
 template <typename T0, typename T1>
 struct binary_operator<index_op, T0, T1>
 {
-    typedef typename T0::reference result_type;
+    typedef BOOST_TYPEOF_TPL(&T0::operator[]) index_op_t;
+    typedef typename boost::result_of<index_op_t(T1)>::type result_type;
     static result_type eval(T0& container, T1 const& index)
     { return container[index]; }
 };
0262デフォルトの名無しさん2007/12/29(土) 13:58:37
>>261
嬉しいのは分かるけど自意識過剰なの?
0263デフォルトの名無しさん2007/12/29(土) 14:07:18
>>262
何いちいち反応しているの?
興味がないなら無視すればいいだけだろ

#include <boost/current_function.hpp>
により Visual C++ では
#define BOOST_CURRENT_FUNCTION __FUNCSIG__
にされてしまうのはなぜ?
Visual C++ なら __FUNCTION__ があるので
#define BOOST_CURRENT_FUNCTION __FUNCTION__
にならないといけないはずなのに
0264デフォルトの名無しさん2007/12/29(土) 14:39:12
>>263
いやいや興味はあるよ。
“自意識過剰なのか”という点についてね。
0265デフォルトの名無しさん2007/12/29(土) 15:22:05
void foo(){}
void bar(){}
boost::function<void(void)> f1 = foo;
boost::function<void(void)> f2 = bar;
assert(!(f1 == f2))

なぜこの比較が通らないんでしょうか?
assert(f1 == foo) なら通るんですが・・
boost::function のインスタンス同士の
比較はできないのでしょうか?
単純に関数ポインタの比較のようなことをしてくれればいいのですが.
02662652007/12/29(土) 15:52:01
Frequently Asked Questions
Why can't I compare boost::function objects with operator== or operator!=?
http://www.boost.org/doc/html/function/faq.html#id1215129

そのまんまのことが書いてありました.
死ね,俺.
没年2007.
0267デフォルトの名無しさん2007/12/29(土) 16:01:08
>>264
スレ違い
0268デフォルトの名無しさん2007/12/31(月) 12:16:54
gcc4.1だと1.34.1よりsvn headの方が不具合が少ないような気がするんですが
気のせいですよね?
0269デフォルトの名無しさん2007/12/31(月) 15:38:12
1.34.1後にバグが修正されてるのだっていっぱいあるんだろうから
不思議ではないだろ
0270デフォルトの名無しさん2007/12/31(月) 23:49:00
Boost ではデバッグバージョンのライブラリと通常バージョンの
ライブラリが用意されていますよね、普通。たとえば bjam
でビルドすると両方のライブラリが作られるし、
Debian GNU/Linux や Ubuntu で boost-dbg を入れると
デバッグ用のライブラリが /usr/lib 以下に入り、
通常バージョンのライブラリと同居します。

で、ふと思ったのですが、Linux の一般的なディストリビューション
(RHEL や Debian) で libhoge, libhoge-dev を入れると
/usr/lib 以下に入る libhoge.a や libhoge.so は一種類だけで
特にデバッグバージョンと通常バージョンという区別はありません。
Linux のディストリビューションではパッケージングの際に
デバッグ情報をつけるか否か、デバッガで扱えるように
最適化をオフにするか否か、などについて取り決めがあるのでしょうか?
0271デフォルトの名無しさん2008/01/02(水) 12:19:06
1.35 って asio まわりの頻繁なコミットが終わったら
リリースされるのかな?
0272デフォルトの名無しさん2008/01/02(水) 16:28:40
GILがまともに使えるようになってからにしてほしいな。
jpegとpngの読み込みを正式にコミットして、
pngも通過色とかまともに対応して、
スケーリングなども用意して。
0273デフォルトの名無しさん2008/01/02(水) 16:29:41
GILとは?generic imaging libraryかなんか?
0274デフォルトの名無しさん2008/01/03(木) 02:20:39
VC++8.0とboost1.34.1を使って開発しています。

struct my_device
{
typedef char char_type;
typedef bidirectional_device_tag category;

streamsize read(char_type *s, streamsize n);
streamsize write(const char_type *s, streamsize n);
};

int main()
{
my_device device;
stream<my_device> s(device);
char one = 'b', two = 0;

s.put(one);
s.get(two);
}

my_device::write
my_device::read
の順番で呼ばれると思ったのですが、なぜかmy_device::readのほうしか呼ばれません。
なぜこのようになるのかご存じの方がいらっしゃいましたら教えてください。
0275デフォルトの名無しさん2008/01/03(木) 07:35:44
Boost Graph Library (BGL) 使っている人いますか?
BGL ではグラフの頂点や辺にプロパティを設定して
値を持たせることができますが(たとえば「色」とか),
ある値をプロパティとして持つ頂点や辺を高速に
列挙させることはできるのでしょうか?

頂点イテレータなどで全探索して列挙するのはつらいので,
プロパティマップを boost::multi_map::multi_map_container
などをつかってキーでも値でもインデックスされているような
コンテナでプロパティを保持できればと思っているのですが.

外部プロパティとして持てばよいのではないかとも思うのですが,
たとえば boost::print_graph は vertex_index_t を内部プロパティ
として持っていることを前提に作られているので,
内部プロパティの持ち方を指定してうまくやれればいいと思っています.
0276デフォルトの名無しさん2008/01/03(木) 08:51:59
こういうものを作ったんですけど、もしかして似たようなものがboostにありますか?
もしあるのだったらboostの方を使いたいです。

int var;
//キャストが必要な長い式
var = (int)(0.123456789 * 9.87654321 / 0.123456789);

//「キャストをする」と表明するだけで
//具体的な型や乱雑な括弧が必要ない
var | mycast = 0.123456789 * 9.87654321 / 0.123456789;
0277デフォルトの名無しさん2008/01/03(木) 09:00:12
仕様の詳細(初期化のみ?コピー等の動作は?)がよくわからんが、BOOST_AUTOみたいなもんかね。
0278デフォルトの名無しさん2008/01/03(木) 09:16:53
仕様というか、単に=よりも結合順位の高い演算子で左辺の参照を受け取って
operator =で右辺を代入してるだけ。
0279デフォルトの名無しさん2008/01/03(木) 09:19:18
どういうときに使うの?
0280デフォルトの名無しさん2008/01/03(木) 09:28:45
「キャストをする」と表明するしたいだけで具体的な型や乱雑な括弧を書きたくない時。
0281デフォルトの名無しさん2008/01/03(木) 09:35:05
BOOST_AUTOって変数になるトークンと初期化式を書いて
初期化式の型から変数の型を判断するやつだね。
俺が書いたのは単に代入用だけだよ。
0282デフォルトの名無しさん2008/01/03(木) 09:36:58
template<typename T>
class auto_cast_wrarapper {
    T& obj_;
public:
    auto_cast_wrarapper(T& obj)
        : obj_(obj)
    {}
    template<typename U>
    T& operator=(U const& obj) {
        return obj_ = static_cast<T>(obj);
    }
};
class auto_cast {};
template<typename T>
auto_cast_wrarapper<T> operator|(T const& lhs, auto_cast rhs) {
    return auto_cast_wrarapper<T>(lhs);
}
static auto_cast mycast;

こんな感じかな。まあboost::enable_ifとか使ってもうちょっと上手く実装してるとは思うけど。
とりあえずboostに同様のものは無かったと思われ。
02832822008/01/03(木) 09:39:57
wrarapperってなんだorz
wrapperね。
0284デフォルトの名無しさん2008/01/03(木) 10:17:30
乱雑な括弧もなにも、右辺全体を一組の括弧で括るだけじゃないか。
0285デフォルトの名無しさん2008/01/03(木) 10:23:04
まあ、Cのキャストを使ってる時点でなんだかなぁ、と思う。
varがint形とdouble形のコンストラクタと代入演算子を持っていて、
それぞれ意味が違う場合はどうするの?
0286デフォルトの名無しさん2008/01/03(木) 14:48:38
組み込み方にしか適応できない様にする。
0287デフォルトの名無しさん2008/01/03(木) 18:11:52
>274
単にバッファリングされてるだけなんじゃないの?
>Note that the Iostreams library provides buffering by default. Consequently, the stream out must be flushed before
>the characters written are guaranteed to be reflected in the underlying string.

>http://www.boost.org/libs/iostreams/doc/tutorial/container_sink.html

>275
「BGLでは」ではなくて、むしろ「adjacency_list と adjacency_map では」が正しいんじゃないの?
内部プロパティに対するアクセス方法としては、PropertyGraph か MutablePropertyGraph に対応するものしか
用意されてないし、EdgeList とかの持ち方はカスタマイズできるけど内部プロパティの持ち方はカスタマイズできないと思う。
で、内部プロパティと外部プロパティを併用したら駄目なん?
あるいは、いっそのこと、自分で BGL の Concept に沿ったクラスを作っちゃえばいいんじゃないかな?
0288デフォルトの名無しさん2008/01/03(木) 18:39:49
274です。
writeの後にflushをしたら期待した動作になりました。
ありがとうございました。
0289デフォルトの名無しさん2008/01/03(木) 19:17:02
>>287
そうですね.外部プロパティとの併用にします.
BGL って Graphviz への出力もできるし,
その時の VertexPropertyWriter は
boost::bind や boost::lambda でファンクタ
自在に作れるし,便利ですね.
0290デフォルトの名無しさん2008/01/04(金) 01:55:41
string の vector の vector について、
各要素を std::cout に出力したいとき、
boost::bind でうまくファンクタかけないかな?
0291デフォルトの名無しさん2008/01/04(金) 10:42:43
3行目が全く意味不明
■ このスレッドは過去ログ倉庫に格納されています