Boostを語れゴラァ part5at TECH
Boostを語れゴラァ part5 - 暇つぶし2ch2:デフォルトの名無しさん
07/10/18 08:10:02
■関連書籍■
Boost C++ Libraryプログラミング
URLリンク(www.amazon.co.jp)

Beyond The C++ Standard Library
URLリンク(www.amazon.co.jp)

C++ Template Metaprogramming
URLリンク(www.amazon.co.jp)

The Boost Graph Library
URLリンク(www.amazon.co.jp)

■関連スレ■
C++相談室 part58
スレリンク(tech板)

【C++】STL(Standard Template Library)相談室 7
スレリンク(tech板)

3:デフォルトの名無しさん
07/10/18 08:10:07

Loki
URLリンク(sourceforge.net)

JTC1/SC22/WG21 - The C++ Standards Committee
URLリンク(www.open-std.org)

POCO, the C++ Portable Components
URLリンク(www.appinf.com)
URLリンク(sourceforge.net)

The unofficial BCB Boost patches
URLリンク(bcbboost.sourceforge.net)

4:デフォルトの名無しさん
07/10/18 12:31:01
>>1

5:デフォルトの名無しさん
07/10/18 19:28:37
 ,、ヽl |l | l| l || l| l |   ビ ク ッ
ミ   お っ 立 も __ノ   _,.ヘ     _,,... -- ─--「::「 {i:.:.:`'、_/:.:.:.:.:.[/-...,,_   ソ ,'  い
Ξ   っ あ て っ )  /::7ヽ、ヘ,.-ァ'^ヽ∠ヽ,/L__`|:::|/}!.:.:.:.:r7=-:.:.:.:.!7::::::::::::`ヽ. ッ  i   け
ニ  立 ぁ な  も   !::::!´ア「>'‐''"´    `"'<LL_,'i>:'へ、:.:.:.:.:.:.r/::::::::::::::::::::::':., .|.  な
Ξ   て ん い う   /´\「>'"            ァ':::::::::::::::\__」}:::::::::::::::::::::::::::::ヽ.!  い
三  ち  ・  っ 糞  ,'  _」ア´  /  /!    !  /!   / ;'::::!:::::::';:::';::::::::ヽ::::::':;::::::::::::::、::::!  子
=    ゃ  ・  て ス   i 'ヽ!   / 7, 'イハ /! メ、,!__ハ, 'i::::::ト,::::::!::::i::::i:::::::':;:::::';:::::::::::::::ヽ;|  ね
三  ぁ  ら 約  レ   ', .,'  / /!,!-'、:レ' |/ァ' レ   ヽ!::!:::! ':;:::|ー!-ハ::::::::i:::::::!::::::::':;:::::::ヽ:
=  ら  め 束 は   !/  ;' ,ヘ!i. i,.ハ    、,_    !!::!:;ハ ヽ,jァr-;、!_ハ」:::::;':::::::::::::ヽ,::::::::;ゝ、.,__
ニ  め  っ  っ ・   ノへ,/レヘ, ! ゝ' ....::::::... '  ̄´゚o'レヘjソ :::.. 」_r!`> 7__/:::::i::::::::::::::
三   ぇ   ・   ・  ・   !  ノ; ./7''"///     /// !/.   !      '"'",':::::::!::::::i:::::::::::i   変
=   ぇ   も  ・  ・   ノ;  / ,'  ゝ、   ( ヽ  u (  ) ハ        !:::::;'::::::::':;::::::!.   態
三  ぇ  う   ・  あ  〈,へレ'〈ジi/ミ>.、..,,____  ,. イ   ( )`ヽ. ̄フ    !:::/i_;;::;;_:::::<   さ
≡,  ぇ  糞 は ぁ     i `:、レ'"´  !_r'"レ'/:::::::::>ァ、/|ヘ ヽ,__,..,.-''" ̄`ヽ、_ヽ:::':;!    ん
Ξ,   ぇ .ス  ぁ っ     ':,  `ヽ、 ,r;く:::::::!/::::::::::::/」;'  `ヽ. _>'"        Yヽ:::::!.   ?
 彡 !  レ  ん っ     ヽ、   ,.kヘ_!::::ム:::::::/]/ ,ァ-'‐''"´ ヽ!、_        〉:.!.  


6:デフォルトの名無しさん
07/10/19 11:59:31
>>1


7:デフォルトの名無しさん
07/10/19 20:36:20
>>5


8:停止しますた
07/10/24 12:55:39
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ

9:デフォルトの名無しさん
07/10/24 12:56:17
?

10:デフォルトの名無しさん
07/10/26 11:37:43
来たよ!

11:停止しますた
07/10/26 11:38:17
偽・スレッドストッパー。。。( ̄ー ̄)ニヤリッ

12:デフォルトの名無しさん
07/10/27 03:28:33
12

13:745
07/10/27 03:54:01
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#define BOOST_MEM_FN_ENABLE_STDCALL
#define BOOST_BIND_ENABLE_STDCALL
#include <boost/bind.hpp>

struct F
{
  int __stdcall f(int) { return 0; }
};

int main(void) {
  namespace bll = boost::lambda;
  F f;
  boost::bind( &F::f, &f, bll::_1 )(1);
  // bll::bind<int>( &F::f, &f, bll::_1 )(1); <- error!!
}

__stdcallの関数はboost::lambda::bindでは呼びだせないんでしょうか?
boost.usersで次のような古い記事を見付けたのですが
URLリンク(tinyurl.com)
この通りに戻り値を明示的に指定しても無駄なようです

14:デフォルトの名無しさん
07/10/27 06:25:20
boostにLokiのディスパッチャのような物はありますか?

15:デフォルトの名無しさん
07/10/27 19:41:25
           _」, -─  .:. :. :. :.::::::::::::::::::::::::.:.`ヽ
          〈  ,.'"´ ̄      ̄`ヽ、.:::::::.:.:./
           V´ .::l:|:.  `、ヽミミヽ、  ヾ:./    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
              / .::l::从ト、   `ヾ_ミミヽ、  ヽ  <  君さぁこんなスレッド立てるから
          l/l.:l.:リ仁リニトト、仁≧ミヽ:::ト、 .:::|    |  厨房って言われちゃうんだよ
           `Y::{fトッソ ``ト。ッソ` 1:l:|::`、:::::!    \______________
            |.::l´¨ 、  ´ ̄  /::リ::::::::V
             ヽ:ヽ、  ー     , タ::l:;:::::::/     , -‐─‐‐- 、
            , -─-、 __ , イ/.::j:|:::/l/  , ィ"´  ‐f ‐    \
           /.,    `トい、_,/^i.:l:|/  .//  ,  -─‐- 、`ヽ\
          /.:::/  .:i   {{i^Y^YYy'l/  〈 〃 ,ィ´  .:.:.:.:.::.:::::i::l:.\j ト、
          /.:.::::/  .:.::|   k1 |:l ,ム;、ハ、  V__/:::l/::::/:/.::::,イ.:::ハ!:l::::::.:V /  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        L.::::厂ヽ .:.:::::|  / {j! ーイ:介;l/ ,ハ /ハ!::/l:::/:/.::;ィイ/:::ハ:::|:::i.:.::{/ < おまえのことを必要としてる奴なんて
         {7 / \::::! /  jfl  |:1j! |:|{ Vi l:1ホ{:::l:i;:ィニー 、//-十1:,'.:.:,リ   | いないんだからさっさと回線切って首吊れ
       //   ,.イ:::l/  jf|  l;」jl j:」| |::H:|  {::l:iイヒリソヽ  イヒッソl/, イ/    \_________________
    /´ ̄    /::::|:;:;.\  kiL,  H  fj 〉; |:ト、_,{::ト.、_' ' '  '   ̄ / /i
    _>ーー-  ,.イヽ、::l;;;:;:;:;(:::/タ^Tニム、_ ,';{:/ |:|:::Y´「 ̄`ハ、 `´ , .イ _j/::|
   /。 ̄`¨`ヽ_ソ  `1>‐-ヽ{:::::/><!::::::7  |i::ノ {  /.::`K T.::::/ /.:::|
  ,/。     /      〉ニ三云\:.ヽ<ノ::::::」ヽ. Y  ,レ'´.::::::::::.〉ハコ``Y::.ヽ
 /     /       /¨´ ̄ ̄`ヽ、三三ミ<::::| | //.:::::::::::::::://´j}ト、 _」::::::|

16:デフォルトの名無しさん
07/10/27 19:47:44
>>15
不覚にも噴いた

17:デフォルトの名無しさん
07/10/27 22:54:09
>>14
boost::type
boost::bool_
boost::int_
boost::integral_c
あたりをどうぞ。これもFAQ気味だな。


18:745
07/10/27 22:59:46
そういう用途ならboost vaultにdispatcherという名前からしてそのものズバリのがあります
これを適当にカスタマイズして使うのがよろしいんじゃないでしょうか?

19:14
07/10/28 08:11:33
レスありがとうございます。

>>17
すみません説明不足でした。
多重ディスパッチによるマルチメソッドです。(Loki::BasicDispatcherとか)

>>18
boost vaultは初めて知りました。(よくみたらLet's Boostにもリンクはってありますね)
ソース見たところ、Lokiの物よりかなり機能が弱く感じます。
Lokiを使うのがいいのかもしれません。

20:デフォルトの名無しさん
07/10/28 18:48:54
boost/type.hppって何に使うんでしょうか?
  // Just a simple "type envelope". Useful in various contexts, mostly to work
  // around some MSVC deficiencies.
ファイルには上記のように書いてありますがどういうこと?

21:デフォルトの名無しさん
07/10/28 20:11:24
template<class T> T f();



f<int>();

と呼べない場合があるので

template<class T> T g(boost::type<T>);



g(boost::type<int>());

と呼ぶ

22:デフォルトの名無しさん
07/10/29 14:56:29
>>20
ディスパッチのユーティリティとして使うとか。
boost/type_traits/detail/wrap.hpp とかもあるね。

template <class T> struct type {};

template <class T>
struct tester {
 template <class U> static char (&test(U*))[1];
 template <class U> static char (&test(type<U>*))[2];
 template <class U> static char (&test(...))[3];

 template <class U> static size_t f1(const U&) {
  return sizeof(test<T>(static_cast<U*>(0)));
 }
 template <class U> static size_t f2(const U&) {
  return sizeof(test<T>(static_cast<type<U>*>(0)));
 }
};

struct X {};
struct XX : X {};

tester<X>::f1(X()); // => 1
tester<X>::f1(XX()); // => 1

tester<X>::f2(X()); // => 2
tester<X>::f2(XX()); // => 3


23:デフォルトの名無しさん
07/10/30 23:24:10
struct char_p_less : std::binary_function<const char*, const char*, bool>{
        bool operator()(const char* left, const char* right) const{
            return std::strcmp(left, right) < 0;
        }
}

typedef std::map<const char*, std::string, char_p_less> QueryMap;

これをLambdaを使って実現したいんですが、Lambda式で書いた結果は関数オブジェクトの値であって、型ではないので
typedef std::map<const char*, std::string, (bind(std::strcmp, _1, _2) < 0) > QueryMap;
このようなことが出来ないです。

typedef std::map<const char*, std::string, function2<bool, const char*, const char*> > QueryMap;
boost::function2<bool, const char*, const char*> compare = (bind(std::strcmp, _1, _2) < 0);
こうしてから使うときに
QueryMap foo(compare);
するしかないですか?


24:デフォルトの名無しさん
07/10/30 23:28:50
いいえ、他の方法があります。

template<class T>
void use_query_map(const T&){
typedef std::map<const char*, std::string, T> QueryMap;
QueryMap foo;

// fooを使う
}

これで、この関数内では使い放題です。

25:デフォルトの名無しさん
07/10/30 23:30:05
use_query_map(bind(std::strcmp, _1, _2) < 0);

を書くのを忘れていました。

26:デフォルトの名無しさん
07/11/02 00:21:10
boost.testのBOOST_PARAM_TEST_CASEマクロの第一引数に
boost::function1のオブジェクトを指定することはできないんでしょうか?
>error C2660: 'boost::unit_test::make_test_case' : 関数に 4 個の引数を指定できません。
のような具合にどうにも通らないようです

#include <boost/test/unit_test.hpp>
#include <boost/test/parameterized_test.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <list>
void test_mask (int, int){}
struct sub_test_suite : public boost::unit_test::test_suite {
  sub_test_suite() : test_suite("sub_test_suite") {
    BOOST_PARAM_TEST_CASE(
      (boost::function1<void,int>(boost::bind(&test_mask, _1, 0x80)))
     , params.begin(), params.end());
  }
private:
  std::list<int> params;
};

using boost::unit_test::test_suite;

test_suite*
init_unit_test_suite( int, char* [] ) {
  test_suite* test = BOOST_TEST_SUITE( "Parameterized boost::function based test case" );
  // add test cases to test_suite
  test->add( new sub_test_suite );
  return test;
}



27:デフォルトの名無しさん
07/11/02 07:55:35
boost::functionからboost::unit_test::callback1への変換が上手くいかないだけのようなので、
このように直接callback1のテンポラリを作って渡してやれば一応コンパイルはできました
boost::functionに対する依存も減りますし、この方法使ってればいいんでしょうかね…

#include <boost/test/unit_test.hpp>
#include <boost/test/parameterized_test.hpp>
#include <boost/bind.hpp>
#include <list>
// user definition test function
void test_mask (int, int) {}
// user definition test class
std::list<int> params;

using boost::unit_test::test_suite;
test_suite* init_unit_test_suite(int, char* []) {
  test_suite* test = BOOST_TEST_SUITE("test");
  BOOST_PARAM_TEST_CASE(
    (boost::unit_test::callback1<int>(boost::bind(&test_mask, _1, 0x80)))
   , params.begin()
   , params.end()
  );
  return test;
}


28:デフォルトの名無しさん
07/11/07 23:22:17
VC++7.1でboost1.33.1ですが
std::wstring sNumber = L"2007";
unsigned short wValue = boost::lexical_cast<unsigned short>(sNumber);
でbad_lexical_castが投げられてしまいます。
unsigned short以外の型では問題は無いのですが。
見あたらなかったのですが既知の問題ですか?


29:デフォルトの名無しさん
07/11/08 00:28:59
コンパイルオプションの
wchar_t をビルトイン型として扱う (/Zc:wchar_t)
じゃない?

30:デフォルトの名無しさん
07/11/09 12:53:53
emacs + gtags
でboostのコード閲覧がvisula studioみたいにできるけど
debugで変数の動きとか追いかけるのもemacsでVisualStudioみたいに
できる方法ないのかな

31:デフォルトの名無しさん
07/11/09 13:20:49
VisualStudioほど便利じゃないと思うけど、gdbで↓

URLリンク(www.coins.tsukuba.ac.jp)
URLリンク(www.coins.tsukuba.ac.jp)


32:デフォルトの名無しさん
07/11/09 13:25:53
.NET Frameworkでvisual Studioの操作を外部プロセスから行う事が出来るから
それをEmacsから操作できるようにするってのがまぁ妥当な方法かも
ただし無駄に面倒だから恐らくやってる人は極少数
なんでVSにはコマンドラインデバッガが無いんだろうね…

33:デフォルトの名無しさん
07/11/09 14:46:43
Visual Studio は統合開発環境で、ホスト・アプリケーションだから。


34:デフォルトの名無しさん
07/11/09 16:27:52
むしろ Visual Studio にプロファイラがついていないことが疑問。
gprof みたいなやつって Windows だとなに?

35:デフォルトの名無しさん
07/11/09 16:54:25
2005から、ガイド付き最適化(GPO)ができた

けど、使いにくいと個人的には思う


36:デフォルトの名無しさん
07/11/09 17:04:00
悔しい、2003なら無料のdevpartnerが使えるのに…!!

37:28
07/11/09 21:01:15
>>29
ありがとうございます、その通りでした。
もう一度、そこら辺のドキュメントがないか見てみます。。。


38:デフォルトの名無しさん
07/11/10 12:01:39
以前のサイト移動しただけだったみたい
URLリンク(syrinx.q.t.u-tokyo.ac.jp)

39:デフォルトの名無しさん
07/11/10 17:07:41
>>34
>むしろ Visual Studio にプロファイラがついていないことが疑問。
Team Editionの一部にはついてるよ。


40:デフォルトの名無しさん
07/11/10 17:25:43
VTune + プロファイラー が intel からでていますよね?
結局それ以外使い物にならないのでは?

41:デフォルトの名無しさん
07/11/10 17:28:41
VTUNEはAMDのCPUでは使えないのだよ…

42:デフォルトの名無しさん
07/11/10 18:24:14
CodeAnalystでいいじゃん

43:デフォルトの名無しさん
07/11/11 18:05:23
bjam ver3.1.15-1経由でcl.exeのメッセージやワイド文字をコンソールに出力するアプリケーションでワイド文字を表示したら悉く???????と表示され、
いかにもロケール設定できてませんよって事態になります。
bjamを使わずに直接cl.exeやワイド文字を使うアプリを起動して表示すればちゃんと表示されのにも関わらずです。
以前のバージョンなら確かにcmd.exe以外のターミナルだろうが、cygwinのbashやzsh上だろうがNTemacsの中のシェルだろうが、
ちゃんと表示されてたんですが、皆様の環境ではどうでしょう?

44:43
07/11/11 18:53:03
もろbjamの問題でした
適当なリビジョンのやつを落としてビルドしたバージョン3.1.14だとこの件に関しては正常に動作しました

45:デフォルトの名無しさん
07/11/13 03:50:17
boost 1331ではboot.pythonでnumpy使えないないのかね
コンパイルは通るけど実行時にエラーでる

46:デフォルトの名無しさん
07/11/14 02:02:53
最新のstableの1.34.1もしくはSVN Headで試してみればどうでしょうか?

47:デフォルトの名無しさん
07/11/14 16:41:47
centosなのでpythonを2.4から2.5にあげるとシステムに不具合でるのです
どうやら
boost1.33.1 python2.4の組み合わせでしか動かないみたいです


48:デフォルトの名無しさん
07/11/21 19:49:45
boost::formatの逆のような処理を行うライブラリはありますか?

try {
 unsigned short us = 0;
 int i = 0;

 (format("%1%, %2%") %us %i) = "0xABCD, -1234";

 BOOST_CHECK_EQUAL(0xABCD, us);
 BOOST_CHECK_EQUAL(-1234, i);
}
catch(const format_error& e) {
}
見たいな感じが理想です

49:デフォルトの名無しさん
07/11/21 19:50:48
それは正規表現の仕事だな
強いて挙げるならregexとかxpressiveか

50:デフォルトの名無しさん
07/11/21 19:52:29
>>48
要するにscanf()のboost版が欲しいわけだ
一言で言えば、無いよ

51:48
07/11/21 20:07:58
了解しますた
xpressive->lexical_cast戦法でいきます

52:デフォルトの名無しさん
07/11/21 20:10:20
なんでlexical_castなんぞ使うんだ?

53:デフォルトの名無しさん
07/11/21 21:08:07
intとかに変換したいからでしょ?
悪かないと思うが。

54:デフォルトの名無しさん
07/11/21 23:15:23
xpressiveを使うならそこはSemantic Actionだろ。
ちょうどいいサンプルもあることだし。
URLリンク(boost-sandbox.sourceforge.net)

55:48
07/11/22 16:09:45
>>54
こんなのあったのかー すごい・・・
でもasのなかでも呼ばれてるlexical_castが16進数とかを良きに計らってくれなくて俺涙目w

56:デフォルトの名無しさん
07/11/22 19:04:45
>>55
spirit と bind に触発されて昔作ったもの。
sprintf や sscanf みたいなことを spirit っぽく静的に記述する。

string strA, strB;
sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" );
sprint( strB, "2 " % (!_0x[6]) % "/" %_s, 10, "aaaa" );
cout << strA << endl; // 1 0xa/aaaa
cout << strB << endl; // 2 0x000a/aaaa

int xA, xB;
string yA, yB;
sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA );
sscan( strB, "2 " % _x % "/" % _s[3], xB, yB );

print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA );
print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB );

// xA = 10
// yA = aaaa
// xB = 10
// yB = aaa

URLリンク(kansai2channeler.hp.infoseek.co.jp)



57:デフォルトの名無しさん
07/11/22 23:37:26
notizキターw

58:デフォルトの名無しさん
07/11/22 23:48:11
notizと聞くと某ゴーストとか火狐のテーマとかを思い出す俺は異端かな

59:デフォルトの名無しさん
07/11/22 23:49:16
tupleをsinkやsourceにしてそれに対するfilterにしたらとても面白いかも・・・
でも今の僕にはその技術はありませんでしたというオチ

60:デフォルトの名無しさん
07/11/23 14:17:00
MFCやCLIを基本として、BoostだのLokiだのSTLだのATLだのWTLだのを
覚えなきゃならないなんて、C++は大変だな。
おまけにXMLやるならXML用のライブラリ、SQLやるならSQL用のライブラリと
キリがない。
C++もういいよ。終了。

61:デフォルトの名無しさん
07/11/23 14:19:41
>>60
頭おかしいのかお前。

例えば、何の言語を使えば
MLやるのにXML用のライブラリを覚えなくていいのか
SQLやるのにSQL用のライブラリを覚えなくていいのか言ってみろ。

62:デフォルトの名無しさん
07/11/23 14:19:58
そうだね、プロテインだね。

63:デフォルトの名無しさん
07/11/23 14:21:20
そこはだがそれがいいと返すべき

64:デフォルトの名無しさん
07/11/23 14:23:27
全部言語仕様に入れたプログラミング言語作ろうぜ。
俺は見てるから。

65:デフォルトの名無しさん
07/11/23 14:23:54
Java厨乙が適切だと思う。そういう俺はD言語厨。

66:デフォルトの名無しさん
07/11/23 14:25:38
どんなにいいライブラリがあっても使いこなせない低脳さん乙と言ってあげるべき

67:デフォルトの名無しさん
07/11/23 14:26:08
MFCが基本と言ってる時点で(ry

68:デフォルトの名無しさん
07/11/23 14:29:11
大体基本って何だよ。
MFCはライブラリで、CLIは実行環境ジャン。


69:デフォルトの名無しさん
07/11/23 14:48:17
最近プロテインをプロティン(どちらかというとプロチン)と発音しているCMを見たんだけどこれって正しい?

70:デフォルトの名無しさん
07/11/23 14:48:25
俺は凡人だから、ちょっと頑張れば>>60が挙げたようなものは片っ端から使えるけど、
並外れて悪い頭を持って生まれてきた人には厳しいかもね。

71:デフォルトの名無しさん
07/11/23 15:17:29
ここはいい釣堀ですね

72:デフォルトの名無しさん
07/11/23 15:23:36
↑はいはーい、いつもの「カレ」のご登場でーす。パチパチ

73:デフォルトの名無しさん
07/11/23 15:35:05
恥かいた時のために、いつでも釣り竿を用意してます

「あ、ヤバ!」と思った時、どれだけ自然に「さっきから竿を構えていた」かのように振る舞えるかがコツ

74:デフォルトの名無しさん
07/11/24 03:07:55
>>73
後から釣りでしたって言った奴の負けだと思いますぅ~♪

75:デフォルトの名無しさん
07/11/24 04:46:35
相手して付き合ってしまってる時点で負けだろ
わざわざ同じレベルに堕ちる必要はあるまいて


76:デフォルトの名無しさん
07/11/24 15:52:12
>>75
おまえもな

77:デフォルトの名無しさん
07/11/25 17:16:34
おまえら、しょうがないなぁ

unit nYakuso = 7; //薬草1個の値段
unit nFukuro[10]; //持ち物を入れる袋
wstring strIppai(L"持ち物が\nいっぱいです><") ;

という文字列を以下のように変換するプログラムを30秒以内で記述できるか?

unit、nYakuso、=、7、;、unit、nFukuro、[、10、]、;、wstring、strIppai、
(、L、"、持ち物が\nいっぱいです><、"、)、;

78:デフォルトの名無しさん
07/11/25 17:39:14
変数名の前に n とか str とか、自分は低脳ですって言ってるようなもんですよ

79:デフォルトの名無しさん
07/11/25 17:43:33
こういうのはperlとか使った方がよさそう

80:デフォルトの名無しさん
07/11/25 17:55:10
>>77
//以下の文字列を無視するのと
クォーテーション文字で囲まれた文字列内で
エスケープ文字を無視するのは標準Boostでは無理。

81:デフォルトの名無しさん
07/11/25 18:02:10
spiritなら頑張れるかも
30秒以内は無理そうだが
xpressiveは知らない

82:デフォルトの名無しさん
07/11/25 18:26:59
ノcomment_p( )

83:デフォルトの名無しさん
07/11/25 19:04:27
>>82
だな

84:デフォルトの名無しさん
07/11/26 05:43:59
30秒以内に記述してもコンパイルに30秒以上かかるんだよ・・・・

85:デフォルトの名無しさん
07/11/26 14:51:55
boost.pythonでboostとpythonのバージョン違いに悩まされるより
swigの方がいいと思った
swigと比べたboost.pythonの利点って何?

86:デフォルトの名無しさん
07/11/26 17:25:04
python コード呼び出すのがらくなことじゃねーの?


87:デフォルトの名無しさん
07/11/26 18:27:45
cmathの関数群とbindについて教えてください。

double x = 25;
cout << bind(sqrt, _1)(x) << endl;

このコードは、VC++2005では実行できるのですが、
g++ 4.0.0 (boost 1.34) だと以下のように明示的に
キャストしないとコンパイルできません。

cout << bind(static_cast<double (*)double>(sqrt), _1)(x) << endl;

これはg++用boostライブラリ固有の制限なんでしょうか?

88:デフォルトの名無しさん
07/11/26 18:44:44
std::cout << boost::bind<double>(&std::sqrt,_1)(x) << std::endl;
bindがオーバーロード解決に失敗するときは戻り値の型をテンプレート引数で明示的に指定してやればいいらしいです

89:デフォルトの名無しさん
07/11/26 18:48:02
あごめん、やっぱ無理っぽい

90:デフォルトの名無しさん
07/11/26 18:49:07
>>87
もしかしたら、VCにはcmathのfloat版関数の宣言がないのではないか?

91:デフォルトの名無しさん
07/11/26 19:30:10
>>88
>>89
>>90
レスありがとうございます。
やはり複数の関数定義があるからなんでしょうかね。
実行はできるので、実装を受け入れることにします。

92:デフォルトの名無しさん
07/11/26 22:39:40
template特殊化じゃなくて、overloadだとね。

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



93:デフォルトの名無しさん
07/11/27 01:46:48
ただオーバーロードの名前解決ルールに従うとビッチリdoubleを
指定してるわけだからdouble sqrt(double)を特定できる
はずなんですけどね。コンパイルエラーにもambiguousとは出ていない
ようですし。

94:デフォルトの名無しさん
07/11/28 23:07:10
>93
double を指定しているのは戻り値の型であって、sqrt() の引数の型には寄与してないから特定できないんじゃない?
x の型は bind の解釈には無関係だよね?

95:デフォルトの名無しさん
07/11/29 00:58:51
>>94
_1 は確か引数じゃないかな?戻り値ではないと思ったけど。

96:デフォルトの名無しさん
07/11/29 03:42:26
xpressiveを勉強しているのですがa|b(aまたはb)がうまく動きません

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

smatch m;
const std::string addr("hoge!hoge!!hoge!");
std::string::const_iterator it = addr.begin(), end = addr.end();
 
for( ; regex_search(it, end, m, tok, regex_constants::match_continuous)
   ; it = m[0].second )
{
 std::cout << m[0] << std::endl;
}
このコードで
hoge!
hoge!!
hoge!
と出力されると思ったのですが
hoge!
hoge!
で終わってしまいます

97:96
07/11/29 03:46:41
申し訳ございません 間違えました
検証に使った文字列は
const std::string addr("hoge!hoge!!hoge");
です

98:デフォルトの名無しさん
07/11/29 10:35:19
sregex tok =
 as_xpr("hoge") >> (("!!">>~before(eos)) | ("!">>~before(eos)) | eos);


だろ。普通は


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

なんか俺勘違いしてるのかな。

100:99
07/11/29 12:38:12
あれ?Boost.Compose って deprecated ?

101:デフォルトの名無しさん
07/11/29 12:40:01
lambda::bindを使って
bind(&f, bind(&g, _1))
な風に
でも>>13のように呼び出し規約が__stdcallの関数については使えないようだ
mlには使えるって書いてあるんだけどねぇ・・・誰か使えた人いないのかなぁ

102:99
07/11/29 12:48:31
#include <boost/lambda/bind.hpp>
boost::lambda::bind

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

どちらを使うべきなのでしょうか?

103:デフォルトの名無しさん
07/11/29 12:53:19
合成関数目的ならどっちでもいけるけど
__stdcallのものにでも使えるという点でboost::bindかな・・・

104:99
07/11/29 12:56:54
THX.
ところで、ファンクタの合成って標準のSTLには入ってないよね?
SGIのだけに入ってるとか、そういうことあるのかな?
少なくとも Visual C++ だと compose_f_gx_hx などはありませんでした。
boost::bind のほうがもっと柔軟だから compose_f_gx_hx いらないけど。

105:デフォルトの名無しさん
07/11/29 22:56:21
>104
標準化される前の SGI STL には compose1, compose2 があった。っていうか今もある。
現行の標準規格には入っていない。
compose_f_gx_hx は Boost.Compose での名前。
C++0x では Bind が標準に入るので今後は bind 使えになると思われ。

106:デフォルトの名無しさん
07/11/30 02:01:44
Scott Meyers' Effective C++: TR1 Information
URLリンク(www.aristeia.com)

266 tr1::bind Function Object Binders n1455

107:99
07/11/30 15:00:08
_1 とか _2 って boost::lambda 名前空間以下にしかないよね?
boost::bind も併用しているんだけど、
そうすると ambiguous って言われる?

108:デフォルトの名無しさん
07/11/30 15:12:46
言われる

109:99
07/11/30 15:15:54
だは~
無名名前空間の下に見えてる _1 はどっから来たものか・・・
#include <boost/bind.hpp> だろうなぁ。
::_1 って指定してやらないとダメみたい。

110:デフォルトの名無しさん
07/12/02 18:50:17
Visual C++ 2008 Express Edition だとさらに
果敢に IntelliSense が攻めてくれるね.

だけどまた boost をリビルドしなきゃならんのか…
今からやろうと思うんだけど, svn trunk から
とってきたのを直接ビルドしてみようと思う.無謀?

111:110
07/12/02 18:58:00
URLリンク(svn.boost.org)

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

ってことは,すでに trunk では対応しているのか.
退行テストも通ってるのかな.しかし svn から export
して持ってきたものをどうやってビルドするのかわからん・・

112:110
07/12/02 19:24:56
bjam ビルド中。
あっさり toolset 名として vc9 が検出されたみたい。
つーか、bjam をビルドしようとして build_dist.bat を
実行したらすでに本体のビルドまで勝手にやってくれているのだが・・・
以前ビルドしたときとは大違いに楽になってる気がする。

113:110のチラシの裏
07/12/02 19:31:29
ごめん、ウソ。いま改めて
bjam.exe --build-dir=builddir --toolset=msvc-vc9express stage
やってます。Express Edition は固有の toolset 名を持ってるのか?
もしかして 64 ビット版のライブラリをビルドするか否かを決定してる?

114:110のチラシの裏
07/12/02 19:37:30
しかし Graph とか正規表現ライブラリの Unicode サポートとか
使おうと思ったら expat や icu4c も vc9 でビルドしなおさなきゃ
らんのかなぁ。

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

とはいえ、 vc8 用にビルドした boost を vc9 でビルドしてる
アプリケーションからリンクするとリンカが怒るので仕方ない。

115:110のチラシの裏
07/12/02 19:59:26
Visual C++ 2008 Express Edition で 1.35 ビルド終了。
failed 2 って出たけど、どこで失敗したのかわからん。
bjam はログを残してくれないのか?

116:デフォルトの名無しさん
07/12/02 20:10:38
(bjam ほにゃらら 2> err.txt) > log.txt

117:110のチラシの裏
07/12/02 20:17:39
え、Windows の cmd.exe でも stderr のリダイレクトできたのか。
bash ばっかりだからしらんかった。

118:110
07/12/03 00:12:14
bjam で --toolset=msvc-vc90 にしてるのに
libboost_graph-vc-mt-gd-1_35.lib
みたいにライブラリファイルの名前中のツールセット名が
-vc- になるのは、なぜ~~~?

自分で変更するのタルい。

119:デフォルトの名無しさん
07/12/03 00:34:06
Boost.BuildがV2になった直後はそんな話も出てたような
まぁperlかPowerShell使えばリネームなんて簡単だろ

120:デフォルトの名無しさん
07/12/03 00:34:49
前に同じような減少に見舞われたときは
原因を調べるもの面倒だったからファイル名を一括置換した
なんでそうなるんだろうなあ

121:110
07/12/03 05:34:34
>>119
まぁリネーム自体は簡単なんだろうけど,そもそも
ツールセット名ってどっかで正規化されていないのかと.
bjam で指定するツールセット名も msvc だけでも
受け入れられるし, msvc-vc8 や msvc-vc80 なども
変に柔軟に受け入れられるけど,オートリンクでは vc80
とか指定してくるし…

「自分でつけた名前だろ!自分でオートリンクできずにどうするよ!」
って突っ込みを入れたくなった.

122:110
07/12/03 09:08:54
ツールセット名は msvc-8.0 と msvc-9.0 にすると
ちゃんと vc80 と vc90 って文字がライブラリのファイル名に含まれます。

msvc / msvc-vc80 / msvc-vc90 も受け入れられるけど、
そうするとライブラリのファイル名におけるツールセットの部分が
vc になってしまってオートリンクなどで都合が悪いです。

123:110自分用メモ
07/12/03 09:41:13
V:\boost-vc8>bjam --builddir=builddir --build-type=complete
--toolset=msvc-8.0 stage

V:\boost-vc9>bjam --builddir=builddir --build-type=complete
--toolset=msvc-9.0 stage

124:デフォルトの名無しさん
07/12/05 12:27:20
BOOST_STRONG_TYPEDEF マクロって,テンプレート版ないのかな?
typedef StrongTypedef<int> MyIntType;
みたいに使いたい.自分で勝手に上のような使い方をしてるけど,
標準があるならそちらに従いたい.

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

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

#全部「おまえがやれ,自由に」と言われそうだけど
#標準が決まってるほうが可読性が上がると思う.


125:デフォルトの名無しさん
07/12/05 14:12:06
>>124
> もっと一般に additive とかそういうのを
> 持っているバージョンもあればいいと思う.

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

この辺は、 class NAME##_archetype { ってマクロでやってるから、
テンプレートに文字列処理がないとテンプレートだけでやるのは厳しいね。

126:デフォルトの名無しさん
07/12/05 21:17:01
bjamでビルドするときコンパイラに追加で渡したいフラグを設定するにはどのようにすればよいですか?

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

できればboost/config/user.hppとかをいじくらずbjamのオプションとかで渡したいです

127:デフォルトの名無しさん
07/12/05 21:20:50
bjamのオプションもたぶんあるんだろうけど、
わかんなかったら環境変数CLを使えばよいんじゃないかな。

128:126
07/12/05 21:45:28
わぉ 環境変数はずっとCFLAGSに設定してました
ありがとうございます

129:デフォルトの名無しさん
07/12/07 07:57:36
scoped_ptr の実装を見て operator! が定義されているから
safe bool idiom にしようとおもって scoped_ptr を
継承した my_scoped_ptr を作ったら conversion が
ambiguous だって怒られた.

130:デフォルトの名無しさん
07/12/07 10:07:16
class A : public B のようにクラスを継承しています。
B に非侵入型の serialize が定義されている場合には
A の serialize も非侵入型にしなくてはならないのでしょうか?

131:130
07/12/07 11:04:41
すみません、自分の勘違いだったようです。
boost::serialization 関係でもうひとつですが,
BOOST_STRONG_TYPEDF で定義した型はそのまま
シリアライズできないのでしょうか?
自分で非侵入型の serialize を定義するべきですか?

URLリンク(boost.org)
ここを見ると BOSOT_STRONG_TYPEDEF(T,D) で作った型 D
をシリアライズする際には T に自動的に変換されるので
そのままでいい、ということのようですし、実際
BOOST_STRONG_TYPEDEF マクロの定義を見ても
そこで定義されている構造体には確かに変換が用意されているようなのですが

132:デフォルトの名無しさん
07/12/08 12:44:00
Boost.Preprocessorで、BOOST_PP_CAT(t, Foo)が
tFoo でなく tWFoo と展開されたのだが・・・

t が他の文字ならおkで、また別のプロジェクトだと tFoo と正しく展開された。
ずっと解決できないので誰かご教授ください m(_ _)m


133:デフォルトの名無しさん
07/12/08 13:06:20
>>132
tっていうマクロかtFooっていうマクロが定義されてるとか?

134:デフォルトの名無しさん
07/12/08 21:19:07
boost::bindで拘束する変数はコピー可能なオブジェクトでないと駄目ですか?

135:デフォルトの名無しさん
07/12/08 21:39:51
>>134 ref、cref

136:デフォルトの名無しさん
07/12/08 21:43:20
>>135
ありがとう

137:132
07/12/09 05:28:54
>>133
左手のトークンの末尾が 't' だと駄目なようです。
BOOST_PP_CAT(Get, Hoge) とか BOOST_PP_CAT(Object, Piyo) とか。

138:デフォルトの名無しさん
07/12/09 08:20:28
>>137
それはもしかしてプリプロセッサのバグじゃないか?
使ってるプリプロセッサ何?

139:132
07/12/09 08:59:35
>>138
VC++ Express 2005 です。
新規プロジェクト作り直して丸ごと移したら正常にコンパイル出来ました・・・
何か気持ち悪いけど、どこかプロジェクトの設定が壊れてたのだと思います。
お騒がせしました。

140:132
07/12/09 09:49:06
と思ったらまた再発したorz 何だこれ

141:デフォルトの名無しさん
07/12/09 10:28:26
2005でboost使うのは辞めてくれ。
stdとtr1だけにしとけ

142:デフォルトの名無しさん
07/12/09 10:37:55
>>141
VC++7.1 は対応度高かったと思うけど 2005 だともしかして劣化してる?
2008 beta はどうなんだろ。

143:デフォルトの名無しさん
07/12/09 11:51:47
初耳だな

144:デフォルトの名無しさん
07/12/09 12:04:45
>>142
2008はもう正式版出ているw

145:デフォルトの名無しさん
07/12/09 12:56:18
>>141
何の問題もないが.
時々 IntelliSense が黙るだけで.
VC9 ではかなり賢くなってる.
それでも boost::bind つかいまくりで
ファンクタ合成しまくりとかで黙ることもある.

146:デフォルトの名無しさん
07/12/09 14:09:37
VC8だとuBLASにlambdaにfunctionにmplまで使ったらclがエラーで落ちたことがあったな。
SP1当てたら大丈夫になったけどさ。

147:デフォルトの名無しさん
07/12/10 14:24:36
boost::shared_ptr の参照カウンタがゼロになったときに、
delete 以外の解放処理を行わせる方法はありますでしょうか。

extern IMalloc* allocator;
{
boost::shared_ptr<ITEMIDLIST> pidl((ITEMIDLIST*)allocator->Alloc(10));
}
//ここでallocator->Freeを呼ばせたい

148:デフォルトの名無しさん
07/12/10 14:36:59
>>147
デリータを指定できるコンストラクタがあるよ。

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



149:147
07/12/10 15:08:43
おぉぉ、ありがとうございます。
解決しますた。
クラス全体のテンプレート引数 (1個しか無い) にしか目がいってなくて、
コンストラクタのところを見てなかったです。orz

150:デフォルトの名無しさん
07/12/11 00:49:05
>>149
焦っている時にありがちな罠だから落ち着いて資料を読めばいいと思うよ。(自分への叱咤でもありorz)


151:デフォルトの名無しさん
07/12/11 02:45:26
msvc+stlportの環境下で、Boost Build v2で、boostをインストールした人って
いませんか?

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

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

なんていうリンクエラーが出てしまいます。

152:デフォルトの名無しさん
07/12/11 03:53:33
ライブラリをリンクしろ。

153:デフォルトの名無しさん
07/12/11 08:58:58
環境の判定に BOOST_PLATFORM マクロを使おうと
思ってるんだけど、プリプロセッサって
文字列の比較できないよね?
環境の判定によいアイディアあったら教えてプリーズ。

154:151
07/12/11 09:54:39
>>152
[ツール]→[オプション]→[プロジェクトおよびソリューション]→[VC++ディレクトリ]で、
ライブラリファイルのディレクトリとして、
C:\Boost\lib
を追加済みです。

さらに、プロジェクトのプロパティページで、
[構成プロパティ]→[リンカ]→[入力]→[追加の依存ファイル]で、
boost_filesystem-vc80-mt-gdp-1_34_1.lib
を追加してみたのですが、ダメでした。(:_;)

155:デフォルトの名無しさん
07/12/11 11:39:13
>>154=151
普通は「追加の依存ファイル」なんて設定しなくても
オートリンクで適切なライブラリをリンクしてくれるはずなんだけどなぁ。
って STLPort 使ってない俺が言っても意味ないよね。

156:151
07/12/11 14:38:29
>>155
のはずなんだけど・・・。
v1のときは、普通にリンクできていたので。
なんというv2。

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

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

OS: Microsoft Windows SP2
CPU: Intel

157:151
07/12/11 14:39:01
■STLport

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

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

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

> cd build\lib
> configure -c msvc8 --use-boost=C:\boost_1_34_1
> nmake /fmsvc.mak install
でSTLPortをビルド。

158:151
07/12/11 14:41:47
■boost

stlport.jamファイルの不具合を修正する。
 URLリンク(lists.boost.org)参照

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

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

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

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

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

build.logを見たら、
 ...updated 5631 targets...
でビルド成功。

159:151
07/12/11 14:43:59
■試しに動かしてみる。

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

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

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

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

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

return 0;
}

でビルド。

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

チラシの裏みたいでごめん。

160:151
07/12/11 14:46:34
↑にあるコメント行はゴミです。すまん。削除するのを忘れた。。
ビルドの要らないboostライブラリは普通に動きます。lexical_castとか。

161:デフォルトの名無しさん
07/12/11 22:52:53
multi_index_container.hpp なんてのがあるのか orz
俺の一週間の苦労はなんだったんだ……
お前ら、先に教えてくれよ……

λ....トボトボ

162:デフォルトの名無しさん
07/12/12 01:01:52
>>161
どんまい。。。

163:161
07/12/12 08:08:55
さすがにインデックス3つ使って複雑なコンテナ作ると,
Visual C++ 2008 でも IntelliSense が死ぬね.
でも補完機能は IntelliSense がぴか一だと思うんだけど,
それでも追い切れないとは…

164:デフォルトの名無しさん
07/12/12 08:14:29
うーむ、2008はそんなにIntelliSenseがいいのか
2005Pro持ってるけどどうしようかなあ…

165:161
07/12/12 08:46:11
>>164
俺も自前で頑張って買った 2005 Professional 使ってたけど,
今は 2008 Express Edition 使ってます.

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

単に自分が Eclipse の設定をちゃんとしてないからかもしれません.
標準ライブラリまで指定してフルインデックスすれば
Eclipse の CDT でもちゃんと型追っかけてくれるんでしょうかね.

166:デフォルトの名無しさん
07/12/12 11:03:02
ええ。
けど使い慣れたのを使うのが一番だと思います。
ちとスレ違いだしね。

167:デフォルトの名無しさん
07/12/12 15:35:23
2008ってExpress出てるのかよ

168:デフォルトの名無しさん
07/12/12 16:22:35
英語版だろ

169:デフォルトの名無しさん
07/12/12 16:32:16
英語版でもいいよ

170:デフォルトの名無しさん
07/12/12 19:51:46
以下のように、可変個引数(モドキ)をとる関数をtupleを使って作りたかったんですが、
行き詰まりました。関数内でtuple要素全てにアクセスする方法はありますか?
可変個引数が可能ならばtupleじゃなくても構いません。ちなみに、引数の型はすべて一緒です。

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

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

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

}

int main(){

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

   return 0;
}

171:デフォルトの名無しさん
07/12/12 20:23:21
>>170
素朴な疑問なんだが、std::vectorじゃいけない特別な理由でも?
# まぁ、vectorだと即値を列挙することはできないわけだが。

172:デフォルトの名無しさん
07/12/12 23:19:47
>>170
boost::fusionならfor_eachができるんだが
ループ内で全要素にアクセスってのは無理だな。

173:デフォルトの名無しさん
07/12/13 08:02:53
boost fusion について日本語で解説したページってある?

174:デフォルトの名無しさん
07/12/13 14:14:22
NiceBoost

175:デフォルトの名無しさん
07/12/13 20:19:04
>>170
boost::assign::list_of

176:デフォルトの名無しさん
07/12/13 23:31:39
>>170
tuple って単に car が get_head で、cdr が get_tail なので、
 tuple_for_each(t, f) { f(t.get_head()); tuple_for_each(t.get_tail(), f); }
tuple_for_each(null_type, f) {}
とかを作ってしまえばいい

で、なぜか iterator/zip_iterator.hpp の detail 内にあったりするわけだが

177:デフォルトの名無しさん
07/12/14 07:11:53
boost::multi_index_container で
boost::multi_index_container::tag
を使うと Visual C++ 2008 ではエラーになる.
C1001 なので原因がよくわからない.

178:デフォルトの名無しさん
07/12/14 10:41:48
bindとlanbdaを同時に使うとき
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using namespace boost;
using namespace boost::lambda;
とすると、_1 を使ったときコンパイルできなくなる。
boost::lambda::_1 なんてやるとコンパイルできる。
プレースホルダー _1 ってbind.hppでもlambda.hppでも
重複して定義されてる?

179:デフォルトの名無しさん
07/12/14 10:46:27
俺、ファンクタの合成くらいにしか使わないので、
結局 boost::bind だけしか使わないようにした。
って、それじゃ根本的な解決になってないか。

180:デフォルトの名無しさん
07/12/14 12:10:44
>>178
その通り
usingの代わりにnamespaceの短縮名を使うと良いと思う

181:デフォルトの名無しさん
07/12/14 12:32:47
>>180
ありがとう。
で、namespaceの短縮名とは何ですか?
boost::lambda::_1のように常に明示的に
指定するということですか?

182:デフォルトの名無しさん
07/12/14 12:35:49
>>181 namespace bl = boost::lambda;

183:デフォルトの名無しさん
07/12/14 13:33:53
>>182
ありがとう。
別名を与えられることは知りませんでした。
これで対応していきます。

184:デフォルトの名無しさん
07/12/14 15:48:19
bjamのv2の使い方が良く分からないんですが、例えば以下をv2で
書く場合、どのように書いたら良いんでしょうか?
#bjam -sTOOLS=mingw "-sBUILD=release <runtime-link>static <threading>multi <native-wchar_t>on" --prefix=/c/msys/1.0/local install

185:デフォルトの名無しさん
07/12/14 17:59:08
libcgi とか libcgi++ とか libcurl の asio 利用版
なんてのもでてくるのかね?

186:デフォルトの名無しさん
07/12/14 19:14:30
sregex r = sregex::compile( "A([1-9]*|[a-z]*)A" );
string str1 = "A123A AaaaA A3b3A A9A";

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

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

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



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

const_iterator end()const;
Effects: Returns a terminating iterator that enumerates over all the marked sub-expression matches stored in *this.

188:デフォルトの名無しさん
07/12/14 19:35:19
regex_searchじゃなくてregrex_iteratorでも使っとけ

189:デフォルトの名無しさん
07/12/16 00:40:01
regex_searchで
最小マッチ?を指定するとダイアログ出て落ちるんです

190:デフォルトの名無しさん
07/12/16 01:46:33
エスパー魔美

191:デフォルトの名無しさん
07/12/16 20:10:54
URLリンク(pastebin.windy.cx)
boost::serialization::base_object を経由せずに
(Base&) で型変換してシリアライズするのはダメ?
一応読み込むこともできているようなんだけど.

ちなみに (Base) で型変換するとスライシングのせいか
読み込んだ時に正しく読み込むことができません.

192:デフォルトの名無しさん
07/12/16 20:37:23
Resist the temptation to just cast *this to the base class.
This might seem to work but may fail to invoke code necessary
for proper serialization.

マニュアルにはこう書かれているけど,かといって private で
継承した基底クラスをシリアライズするためには >>191
みたいにしないとだめだよねぇ?

193:デフォルトの名無しさん
07/12/17 10:40:42
URLリンク(www.boost.org)
ここには基底クラス A の shared_ptr に派生クラス B のポインタを
持たせてシリアライズしています。なお、 A は仮想デストラクタを
持っています。このとき

boost::archive::text_oarchive oa(ofs);
oa.register_type(static_cast<B *>(NULL));
oa.register_type(
static_cast<
boost::detail::sp_counted_base_impl<
B *, boost::checked_deleter<B>
> *

のように register_type しなければならないようなのですが、
BOOST_CLASS_EXPORT マクロのようなもので登録できない
ものでしょうか? archive を生成してから毎回登録するのは
忘れてしまいがちなので。

194:193
07/12/17 11:14:31
というか、register_type で何を登録すればいいのかがわからん。
URLリンク(archives.free.net.ph)
でまさしく同じ問題についてQ&Aがあるんだけど、
結局上の URL の例をみろってことだけなんだよなぁ。

195:193
07/12/17 11:24:03
URLリンク(pastebin.windy.cx)
どうやらこれだけでいいみたい。
でも文字化けしてしまった…

#そのうち他言語対応しておきます。

196:193
07/12/17 11:25:44
他言語→多言語 orz
しかも sage てなかった orz-----3

197:デフォルトの名無しさん
07/12/17 16:56:24
Boost と POCO ってなかよしなの?
asio とか filesystem とかかぶってるみたいだけど.

198:デフォルトの名無しさん
07/12/18 13:34:06
VS 2008 EE 日本語版

199:デフォルトの名無しさん
07/12/18 18:06:51
class B{
public:
 virtual void mf();
};

class D : public B
{
public:
 void mf();
};
のように継承関係にあるクラスについて
shared_ptrはポリモルフィックに動作しますか?

つまり、
shared_ptr<B> bp(new D);
bp->mf() で D::mf() が呼ばれることはboostの仕様として
保障されてますか?

200:デフォルトの名無しさん
07/12/18 18:09:44
はい

201:デフォルトの名無しさん
07/12/18 18:12:42
thx

202:デフォルトの名無しさん
07/12/21 00:25:47
#include "stdafx.h"
#include <iostream>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
#include <vector>
#include <algorithm>
using namespace std;
namespace bl = boost::lambda;

int main()
{
unsigned int a[] = {0, 1, 1, 0, 1, 0, 0, 1};

for_each(a, a + sizeof(a)/sizeof(a[0]),
bl::if_(bl::_1 % 2 == 0) [cout << "偶数\n"].else_[ cout << "奇数\n"] );

}

これをコンパイルすると

private メンバ (クラス 'std::basic_ios<_Elem,_Traits>'
で宣言されている) にアクセスできません。

とエラーが出てコンパイルできません。原因は何でしょうか?
VC++ 2008 コンソールアプリケーションです。

203:202
07/12/21 00:44:29
自己解決しました。

204:デフォルトの名無しさん
07/12/21 00:54:37
わざわざ通知ありがとうございました。

205:デフォルトの名無しさん
07/12/21 12:42:34
boost::bind(&ClassA::MethodB, this, _1)

みたいなファンクタを生成するとき,ClassA に MethodB
が複数 (void MethodB(int) と void MethodB(double)とか)
定義されていたら,どちらのメンバ関数ポインタになるんでしょうか?

206:デフォルトの名無しさん
07/12/21 12:57:01
内輪で使うために作ったWindows版のバイナリパッケージを晒します.
ビルド環境
Visual Studio 2005 Professional SP1 日本語版
Visual C++ 2008 Express Edition 英語版

vc8 と vc9 でビルドするスクリプト
URLリンク(svn.windy.cx)

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

ヘッダ(共通)
URLリンク(svn.windy.cx)
vc8用スタティック
URLリンク(svn.windy.cx)
vc8用DLL
URLリンク(svn.windy.cx)
vc9用スタティック
URLリンク(svn.windy.cx)
vc9用DLL
URLリンク(svn.windy.cx)

自分はスタティックライブラリしか使わないのでDLL版の動作は未検証.
GMP, MPFR, MPFR++ などのバイナリパッケージも.
URLリンク(svn.windy.cx)

207:205
07/12/21 13:06:06
パッケージは exe だけど,実体は自己展開 cab なので
拡張子を cab に変えればたいていのアーカイバで開けます.
あと,ランタイムに関してですが /MD と /MDd です.

208:206
07/12/21 13:06:56
名前欄間違えた.

209:デフォルトの名無しさん
07/12/21 18:17:17
>>205
static_cast<void (ClassA::*)(int)>(&ClassA::MethodB)
みたいに明示的にキャストしないと通らないと思った。

210:デフォルトの名無しさん
07/12/21 19:11:54
>>209
               ∩
               ( ⌒)     ∩_ _
              /,. ノ     i .,,E)
             ./ /"    / /" .
   _n  グッジョブ!! ./ /_、_   / ノ'    
  ( l    _、_   / / ,_ノ` )/ /_、_    グッジョブ!!
   \ \ ( <_,` )(       /( ,_ノ` )      n
     ヽ___ ̄ ̄ ノ ヽ     |  ̄     \    ( E)
       /    /   \   ヽフ    / ヽ ヽ_//

VC9用をいただきました

211:210
07/12/21 19:13:04
間違えた
>>209 ×
>>206 ○

212:デフォルトの名無しさん
07/12/23 16:13:54
正規表現で調べる文字列にcharやwchar_tの配列は使用できないのでしょうか

213:デフォルトの名無しさん
07/12/23 17:06:19
>>212
char*やイテレータを取るバージョンがあるはずだが

214:デフォルトの名無しさん
07/12/23 18:15:20
>>213
以前のバージョンということですか?
できればxpressiveで書きたいので、最近のバージョンを使いたいのですが
それでは無理ってことでしょうか

215:デフォルトの名無しさん
07/12/23 18:34:45
バージョンと言うかオーバーロードな
と言うかリファレンス見たら?

216:デフォルトの名無しさん
07/12/23 22:54:20
>>215
つ 特殊化

217:デフォルトの名無しさん
07/12/23 23:22:28
つか入力にイテレータ取るバージョンがあれば当然ポインタ食わせられるだろ。

218:デフォルトの名無しさん
07/12/23 23:55:17
sregexがstd::string版なら、cregexがconst char*版。
Xpressiveでは、イテレータの型をテンプレート引数で指定する。
URLリンク(boost.org)

219:デフォルトの名無しさん
07/12/24 08:12:02
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::for_each(v.begin(), v.end(),
boost::bind(operator<<, std::cout, _1));

このようにして各要素を出力することはできないのでしょうか?
なぜだか error C2065: '<<' : undeclared identifier
と言われてコンパイルできません.


220:219
07/12/24 08:54:23
boost::bind に関するこのコードでなぜ最後のコメント部分の
コンパイルが通らないのでしょうか?
URLリンク(pastebin.windy.cx)

221:デフォルトの名無しさん
07/12/24 09:25:58
コンパイルできない理由はちょっとわからんけど、これじゃダメなん?
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout));

222:デフォルトの名無しさん
07/12/24 09:38:51
>>220
g++だと<unresolved overloaded function type>と言われたのでstatic_castしたら通った。
std::for_each(v.begin(), v.end(), boost::bind(
    static_cast<A &(A::*)(int)>(&A::operator =),
    &a,
    _1));

223:デフォルトの名無しさん
07/12/24 09:43:23
>>219
intを出力するoperator <<は、cout (std::basic_ostream)のメンバ関数だから、
そのコードでは、正しいoperator <<へ辿り着けない。
もっとも、それ以前の問題でコンパイルエラーになっているようだが。

今回は221のいうとおりostream_iteratorもあるし、
その他演算子一般の場合は、bind使えなくてもlambdaがある。

224:219
07/12/24 09:48:19
>>221
いや,もちろんそれでやりたいこととしてはOKなんですが,
一般的な演算子を指定できれば応用範囲も広がるかなと思って.

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

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

でも独自にコンストラクタを作ってもコピーコンストラクタは
勝手に作られていたような気がする.

225:219
07/12/24 09:51:05
>>223
なるほど,それで operator<< が見つからないと怒られてるんですね.
たぶんグローバル名前空間の operator<< を探しに行って「無い」
と怒ってるように思います.

自分はてっきりストリームの << 演算子はグローバル名前空間に
定義されていて必要なクラスに friend 指定されているのだと
思っていました.

226:デフォルトの名無しさん
07/12/24 11:35:14
>>224
boost::bindはlambdaと違って一旦メンバーポインタにするから。
だからoverloadされてるとまずい。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch