2011-09-16 17 views
0

このようなことをする方法はありますか(MS VS 2008)?l-値オブジェクトとしてのboost :: bind

boost::bind mybinder = boost::bind(/*something is binded here*/); 
mybinder(/*parameters here*/); // <--- first call 
mybinder(/*another parameters here*/); // <--- one more call 

私は

int foo(int){return 0;} 

boost::bind<int(*)(int)> a = boost::bind(f, _1); 

を試してみましたが、それは動作しません。

+0

「機能しません」とはどういう意味ですか? –

+9

以前の回答を受け入れてください。あなたは1年以上ここにいました.SOの仕組みを学ぶのに十分な時間です。 –

答えて

2

バインドは不特定の型を返します。したがって、型の変数を直接作成することはできません。ただし、任意の関数または関数型に対して構成可能な型テンプレートboost::functionがあります。したがって:

boost::function<int(int)> a = boost::bind(f, _1); 

は、このトリックを行う必要があります。また、functionは関数ポインタからも構築可能であるため、値をバインドしていない場合はプレースホルダだけを使用して、bindを使用することはできません。だから、:

boost::function<int(int)> a = &f; 

は限りfint f(int)あるとして動作するはずです。 、そのC++ 11をそれを呼び出す直接ため、

std::function<int(int)> a = [](int i)->int { return f(i, 42); } 

注:タイプC++ 11のクロージャ(及びbind、また承認された)と一緒に使用するstd::functionとしてC++ 11にそれを作っ

auto a = [](int i)->int { return f(i, 42); } 

しかし、あなたはそれを周りに渡したい場合は、std::functionはまだ便利になる:autoの新しい使用が簡単です。

+0

C++ 11とlambdaを使っているなら、 'std :: function'を使うべきです。 –

+0

@Tomalak:C++ 11の部分を拡張し、 'std ::'に切り替えました。 –

+0

Mucho bettero! :D –

3
int foo(int){return 0;} 
boost::function<int(int)> a = boost::bind(f, _1); 
+0

それは正しいことでもありません。 'a'は関数ポインタとして' foo'と直接等価でなければなりません。ここにバインドする必要はありません。 – Puppy

+0

私は "C2079エラーが発生しました: 'a'は未定義のクラス 'boost :: function​​'を使用します" – fogbit

+0

@fogbit:あなたはboost.functionをインクルードしませんでした。 –

関連する問題