Boostを語れゴラァ part5
■ このスレッドは過去ログ倉庫に格納されています
0001BOOTS
2007/10/18(木) 08:09:35過去スレ
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/
0136デフォルトの名無しさん
2007/12/08(土) 21:43:20ありがとう
0137132
2007/12/09(日) 05:28:54左手のトークンの末尾が 't' だと駄目なようです。
BOOST_PP_CAT(Get, Hoge) とか BOOST_PP_CAT(Object, Piyo) とか。
0138デフォルトの名無しさん
2007/12/09(日) 08:20:28それはもしかしてプリプロセッサのバグじゃないか?
使ってるプリプロセッサ何?
0139132
2007/12/09(日) 08:59:35VC++ Express 2005 です。
新規プロジェクト作り直して丸ごと移したら正常にコンパイル出来ました・・・
何か気持ち悪いけど、どこかプロジェクトの設定が壊れてたのだと思います。
お騒がせしました。
0140132
2007/12/09(日) 09:49:060141デフォルトの名無しさん
2007/12/09(日) 10:28:26stdとtr1だけにしとけ
0142デフォルトの名無しさん
2007/12/09(日) 10:37:55VC++7.1 は対応度高かったと思うけど 2005 だともしかして劣化してる?
2008 beta はどうなんだろ。
0143デフォルトの名無しさん
2007/12/09(日) 11:51:470144デフォルトの名無しさん
2007/12/09(日) 12:04:452008はもう正式版出ているw
0145デフォルトの名無しさん
2007/12/09(日) 12:56:18何の問題もないが.
時々 IntelliSense が黙るだけで.
VC9 ではかなり賢くなってる.
それでも boost::bind つかいまくりで
ファンクタ合成しまくりとかで黙ることもある.
0146デフォルトの名無しさん
2007/12/09(日) 14:09:37SP1当てたら大丈夫になったけどさ。
0147デフォルトの名無しさん
2007/12/10(月) 14:24:36delete 以外の解放処理を行わせる方法はありますでしょうか。
extern IMalloc* allocator;
{
boost::shared_ptr<ITEMIDLIST> pidl((ITEMIDLIST*)allocator->Alloc(10));
}
//ここでallocator->Freeを呼ばせたい
0148デフォルトの名無しさん
2007/12/10(月) 14:36:59デリータを指定できるコンストラクタがあるよ。
template <typename U, typename D>
shared_ptr( U* ptr, D deleter);
0149147
2007/12/10(月) 15:08:43解決しますた。
クラス全体のテンプレート引数 (1個しか無い) にしか目がいってなくて、
コンストラクタのところを見てなかったです。orz
0150デフォルトの名無しさん
2007/12/11(火) 00:49:05焦っている時にありがちな罠だから落ち着いて資料を読めばいいと思うよ。(自分への叱咤でもありorz)
0151デフォルトの名無しさん
2007/12/11(火) 02:45:26いませんか?
VC++8 + STLport-5.1.4 に boost-1.34.1 を入れようとして、
Boostビルドまでは何とかこぎ着けたのですが(コンパイルエラーなしで)、
いざ、boostを使ったプログラムをメイクしようとすると、
error LNK2019: 未解決の外部シンボル
"bool __cdecl boost::filesystem::native(class stlpd_std::basic_string<char,class stlpd_std::char_traits<char>,class stlpd_std::allocator<char> > const &)"
(?native@filesystem@boost@@YA_NABV?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@@Z)
が関数 _main で参照されました。
なんていうリンクエラーが出てしまいます。
0152デフォルトの名無しさん
2007/12/11(火) 03:53:330153デフォルトの名無しさん
2007/12/11(火) 08:58:58思ってるんだけど、プリプロセッサって
文字列の比較できないよね?
環境の判定によいアイディアあったら教えてプリーズ。
0154151
2007/12/11(火) 09:54:39[ツール]→[オプション]→[プロジェクトおよびソリューション]→[VC++ディレクトリ]で、
ライブラリファイルのディレクトリとして、
C:\Boost\lib
を追加済みです。
さらに、プロジェクトのプロパティページで、
[構成プロパティ]→[リンカ]→[入力]→[追加の依存ファイル]で、
boost_filesystem-vc80-mt-gdp-1_34_1.lib
を追加してみたのですが、ダメでした。(:_;)
0155デフォルトの名無しさん
2007/12/11(火) 11:39:13普通は「追加の依存ファイル」なんて設定しなくても
オートリンクで適切なライブラリをリンクしてくれるはずなんだけどなぁ。
って STLPort 使ってない俺が言っても意味ないよね。
0156151
2007/12/11(火) 14:38:29のはずなんだけど・・・。
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
0157151
2007/12/11(火) 14:39:01stlport/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をビルド。
0158151
2007/12/11(火) 14:41:47stlport.jamファイルの不具合を修正する。
http://lists.boost.org/boost-build/2007/08/17123.php参照
user-config.jamファイルを編集する。
using msvc : 8.0 ;
using stlport : 5.1.4 : C:/STLport-5.1.4 ;
環境変数を設定する。vsvars32.bat
@set STLPORT_PATH=C:\STLport-5.1.4
@set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;C:\S
TLport-5.1.4\stlport;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;C:\
Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program File
s\Microsoft Visual Studio 8\SDK\v2.0\include;%INCLUDE%
@set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;C:\STLport-
5.1.4\lib;C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\M
icrosoft Visual Studio 8\VC\PlatformSDK\lib;C:\Program Files\Microsoft Visual
Studio 8\SDK\v2.0\lib;%LIB%
(実際はそれぞれ1行です)
vsvars32-stlport.batにリネームして保存。
> "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32-stlport.bat"
ビルド。
> bjam --toolset=msvc stdlib=stlport --without-python install > build.log
build.logを見たら、
...updated 5631 targets...
でビルド成功。
0159151
2007/12/11(火) 14:43:59stlport、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のようなエラー。
チラシの裏みたいでごめん。
0160151
2007/12/11(火) 14:46:34ビルドの要らないboostライブラリは普通に動きます。lexical_castとか。
0161デフォルトの名無しさん
2007/12/11(火) 22:52:53俺の一週間の苦労はなんだったんだ……
お前ら、先に教えてくれよ……
λ....トボトボ
0162デフォルトの名無しさん
2007/12/12(水) 01:01:52どんまい。。。
0163161
2007/12/12(水) 08:08:55Visual C++ 2008 でも IntelliSense が死ぬね.
でも補完機能は IntelliSense がぴか一だと思うんだけど,
それでも追い切れないとは…
0164デフォルトの名無しさん
2007/12/12(水) 08:14:292005Pro持ってるけどどうしようかなあ…
0165161
2007/12/12(水) 08:46:11俺も自前で頑張って買った 2005 Professional 使ってたけど,
今は 2008 Express Edition 使ってます.
VC++ スレでは IntelliSense 糞とかいう書き込みを見かけるけど
マクロとテンプレートでの変態プレイにここまで対応してるのは
2005 レベルでもすげぇとおもう.
単に自分が Eclipse の設定をちゃんとしてないからかもしれません.
標準ライブラリまで指定してフルインデックスすれば
Eclipse の CDT でもちゃんと型追っかけてくれるんでしょうかね.
0166デフォルトの名無しさん
2007/12/12(水) 11:03:02けど使い慣れたのを使うのが一番だと思います。
ちとスレ違いだしね。
0167デフォルトの名無しさん
2007/12/12(水) 15:35:230168デフォルトの名無しさん
2007/12/12(水) 16:22:350169デフォルトの名無しさん
2007/12/12(水) 16:32:160170デフォルトの名無しさん
2007/12/12(水) 19:51:46行き詰まりました。関数内でtuple要素全てにアクセスする方法はありますか?
可変個引数が可能ならばtupleじゃなくても構いません。ちなみに、引数の型はすべて一緒です。
template<typename T>
void multi_args(const T& arg){
for(int i = 0 ;i< tuples::length<T>::value ;++i){
//tuple要素すべてにアクセスしたい
//arg.get<i>() は当然だめ
}
}
int main(){
multi_args( make_tuple(1,2,3) );
return 0;
}
0171デフォルトの名無しさん
2007/12/12(水) 20:23:21素朴な疑問なんだが、std::vectorじゃいけない特別な理由でも?
# まぁ、vectorだと即値を列挙することはできないわけだが。
0172デフォルトの名無しさん
2007/12/12(水) 23:19:47boost::fusionならfor_eachができるんだが
ループ内で全要素にアクセスってのは無理だな。
0173デフォルトの名無しさん
2007/12/13(木) 08:02:530174デフォルトの名無しさん
2007/12/13(木) 14:14:220175デフォルトの名無しさん
2007/12/13(木) 20:19:04boost::assign::list_of
0176デフォルトの名無しさん
2007/12/13(木) 23:31:39tuple って単に car が get_head で、cdr が get_tail なので、
tuple_for_each(t, f) { f(t.get_head()); tuple_for_each(t.get_tail(), f); }
tuple_for_each(null_type, f) {}
とかを作ってしまえばいい
で、なぜか iterator/zip_iterator.hpp の detail 内にあったりするわけだが
0177デフォルトの名無しさん
2007/12/14(金) 07:11:53boost::multi_index_container::tag
を使うと Visual C++ 2008 ではエラーになる.
C1001 なので原因がよくわからない.
0178デフォルトの名無しさん
2007/12/14(金) 10:41:48#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using namespace boost;
using namespace boost::lambda;
とすると、_1 を使ったときコンパイルできなくなる。
boost::lambda::_1 なんてやるとコンパイルできる。
プレースホルダー _1 ってbind.hppでもlambda.hppでも
重複して定義されてる?
0179デフォルトの名無しさん
2007/12/14(金) 10:46:27結局 boost::bind だけしか使わないようにした。
って、それじゃ根本的な解決になってないか。
0180デフォルトの名無しさん
2007/12/14(金) 12:10:44その通り
usingの代わりにnamespaceの短縮名を使うと良いと思う
0181デフォルトの名無しさん
2007/12/14(金) 12:32:47ありがとう。
で、namespaceの短縮名とは何ですか?
boost::lambda::_1のように常に明示的に
指定するということですか?
0182デフォルトの名無しさん
2007/12/14(金) 12:35:490183デフォルトの名無しさん
2007/12/14(金) 13:33:53ありがとう。
別名を与えられることは知りませんでした。
これで対応していきます。
0184デフォルトの名無しさん
2007/12/14(金) 15:48:19書く場合、どのように書いたら良いんでしょうか?
#bjam -sTOOLS=mingw "-sBUILD=release <runtime-link>static <threading>multi <native-wchar_t>on" --prefix=/c/msys/1.0/local install
0185デフォルトの名無しさん
2007/12/14(金) 17:59:08なんてのもでてくるのかね?
0186デフォルトの名無しさん
2007/12/14(金) 19:14:30string str1 = "A123A AaaaA A3b3A A9A";
if( regex_search( str1, m, r ) )
{
...
}
で、
"123"
"aaa"
"3b3"
"9"
という文字列を取り出すにはどういう記述をすればいいでしょうか?
m[2].str() とか書いても、aaaとか取得できないんです。
sregexでなくxpressive利用でもいいです。
0187デフォルトの名無しさん
2007/12/14(金) 19:35:19Effects: Returns a starting iterator that enumerates over all the marked sub-expression matches stored in *this.
const_iterator end()const;
Effects: Returns a terminating iterator that enumerates over all the marked sub-expression matches stored in *this.
0188デフォルトの名無しさん
2007/12/14(金) 19:35:190189デフォルトの名無しさん
2007/12/16(日) 00:40:01最小マッチ?を指定するとダイアログ出て落ちるんです
0190デフォルトの名無しさん
2007/12/16(日) 01:46:330191デフォルトの名無しさん
2007/12/16(日) 20:10:54boost::serialization::base_object を経由せずに
(Base&) で型変換してシリアライズするのはダメ?
一応読み込むこともできているようなんだけど.
ちなみに (Base) で型変換するとスライシングのせいか
読み込んだ時に正しく読み込むことができません.
0192デフォルトの名無しさん
2007/12/16(日) 20:37:23This might seem to work but may fail to invoke code necessary
for proper serialization.
マニュアルにはこう書かれているけど,かといって private で
継承した基底クラスをシリアライズするためには >>191
みたいにしないとだめだよねぇ?
0193デフォルトの名無しさん
2007/12/17(月) 10:40:42ここには基底クラス 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 を生成してから毎回登録するのは
忘れてしまいがちなので。
0194193
2007/12/17(月) 11:14:31http://archives.free.net.ph/message/20071129.235833.ba9e02a9.en.html
でまさしく同じ問題についてQ&Aがあるんだけど、
結局上の URL の例をみろってことだけなんだよなぁ。
0195193
2007/12/17(月) 11:24:03どうやらこれだけでいいみたい。
でも文字化けしてしまった…
#そのうち他言語対応しておきます。
0196193
2007/12/17(月) 11:25:44しかも sage てなかった orz-----3
0197デフォルトの名無しさん
2007/12/17(月) 16:56:24asio とか filesystem とかかぶってるみたいだけど.
0198デフォルトの名無しさん
2007/12/18(火) 13:34:060199デフォルトの名無しさん
2007/12/18(火) 18:06:51public:
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:440201デフォルトの名無しさん
2007/12/18(火) 18:12:420202デフォルトの名無しさん
2007/12/21(金) 00:25:47#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 コンソールアプリケーションです。
0203202
2007/12/21(金) 00:44:290204デフォルトの名無しさん
2007/12/21(金) 00:54:370205デフォルトの名無しさん
2007/12/21(金) 12:42:34みたいなファンクタを生成するとき,ClassA に MethodB
が複数 (void MethodB(int) と void MethodB(double)とか)
定義されていたら,どちらのメンバ関数ポインタになるんでしょうか?
0206デフォルトの名無しさん
2007/12/21(金) 12:57:01ビルド環境
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/
0207205
2007/12/21(金) 13:06:06拡張子を cab に変えればたいていのアーカイバで開けます.
あと,ランタイムに関してですが /MD と /MDd です.
0208206
2007/12/21(金) 13:06:560209デフォルトの名無しさん
2007/12/21(金) 18:17:17static_cast<void (ClassA::*)(int)>(&ClassA::MethodB)
みたいに明示的にキャストしないと通らないと思った。
0210デフォルトの名無しさん
2007/12/21(金) 19:11:54∩
( ⌒) ∩_ _
/,. ノ i .,,E)
./ /" / /" .
_n グッジョブ!! ./ /_、_ / ノ'
( l _、_ / / ,_ノ` )/ /_、_ グッジョブ!!
\ \ ( <_,` )( /( ,_ノ` ) n
ヽ___ ̄ ̄ ノ ヽ |  ̄ \ ( E)
/ / \ ヽフ / ヽ ヽ_//
VC9用をいただきました
0212デフォルトの名無しさん
2007/12/23(日) 16:13:540213デフォルトの名無しさん
2007/12/23(日) 17:06:19char*やイテレータを取るバージョンがあるはずだが
0214デフォルトの名無しさん
2007/12/23(日) 18:15:20以前のバージョンということですか?
できればxpressiveで書きたいので、最近のバージョンを使いたいのですが
それでは無理ってことでしょうか
0215デフォルトの名無しさん
2007/12/23(日) 18:34:45と言うかリファレンス見たら?
0216デフォルトの名無しさん
2007/12/23(日) 22:54:20つ 特殊化
0217デフォルトの名無しさん
2007/12/23(日) 23:22:280218デフォルトの名無しさん
2007/12/23(日) 23:55:17Xpressiveでは、イテレータの型をテンプレート引数で指定する。
http://boost.org/doc/html/xpressive/reference.html#header.boost.xpressive.xpressive_fwd.hpp
0219デフォルトの名無しさん
2007/12/24(月) 08:12:02v.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
と言われてコンパイルできません.
0220219
2007/12/24(月) 08:54:23コンパイルが通らないのでしょうか?
http://pastebin.windy.cx/?page=view&id=1198454028
0221デフォルトの名無しさん
2007/12/24(月) 09:25:58std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout));
0222デフォルトの名無しさん
2007/12/24(月) 09:38:51g++だと<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:23intを出力するoperator <<は、cout (std::basic_ostream)のメンバ関数だから、
そのコードでは、正しいoperator <<へ辿り着けない。
もっとも、それ以前の問題でコンパイルエラーになっているようだが。
今回は221のいうとおりostream_iteratorもあるし、
その他演算子一般の場合は、bind使えなくてもlambdaがある。
0224219
2007/12/24(月) 09:48:19いや,もちろんそれでやりたいこととしてはOKなんですが,
一般的な演算子を指定できれば応用範囲も広がるかなと思って.
>>222
VC9 だとテンプレートを検索しまくって
「あれでもない,これでもない」と C2780 を連発した揚句,
時々 ambiguous だというエラーも出るんですよ.
なるほど, g++ でもそのままでは通らなくて,
static_cast すれば通るんですね. operator() だと問題なくて
operator= だと問題になる理由がわからないですが.
既定の代入演算子が別途用意されてしまうからかなぁ.
自前で = をオーバーロードした時って既定の = は
定義されないんでしたっけ?
でも独自にコンストラクタを作ってもコピーコンストラクタは
勝手に作られていたような気がする.
0225219
2007/12/24(月) 09:51:05なるほど,それで operator<< が見つからないと怒られてるんですね.
たぶんグローバル名前空間の operator<< を探しに行って「無い」
と怒ってるように思います.
自分はてっきりストリームの << 演算子はグローバル名前空間に
定義されていて必要なクラスに friend 指定されているのだと
思っていました.
0226デフォルトの名無しさん
2007/12/24(月) 11:35:14boost::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
オーバーロードのどれも、すべての引数の型を変換できませんでした
0228219
2007/12/24(月) 14:12:29find_if(ints.begin(), ints.end(), bind(&A::foo, &a, _1));
で,a が const じゃないからじゃね?
間違ってたらごめんne
0229デフォルトの名無しさん
2007/12/24(月) 14:12:530230デフォルトの名無しさん
2007/12/24(月) 16:45:33find_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:02T1 をキーとして扱ってくれる map ってないものでしょうか?
std::for_each で処理する時,std::pair<Key, Value> の
インスタンスが順にファンクタに渡されますが,
そうではなくて Value だけを次々と渡してほしいので,
boost::tuples::get<1> などで値が取り出せる tuples が
便利なのですが・・・
boost::multi_index がそれに該当するのでしょうか?
0232デフォルトの名無しさん
2007/12/24(月) 21:35:570233デフォルトの名無しさん
2007/12/25(火) 19:03:30template <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:48struct 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:39see also
ttp://www.boost.org/libs/iostreams/doc/index.html
0236デフォルトの名無しさん
2007/12/25(火) 19:45:19回答ありがとうございます。
バッファのサイズを1にするだけだと、上のコードは通りますが、
ss.read( buf, sizeof( buf ) );
みたいな使い方をするときに効率が悪い気がするんですが。
ほかにいい方法ありませんか?
■ このスレッドは過去ログ倉庫に格納されています