2013-04-23 11 views
5

のstd ::機能とstd ::バインド動作

#include <iostream> 
#include <functional> 
#include <vector> 

void fun() 
{ 
    std::cout<<"fun"; 
} 

void gun(int) 
{ 
    std::cout<<"gun"; 
} 

int main() 
{ 
    std::vector<std::function<void(int)>> vec; 

    vec.push_back(std::bind(fun)); 
    vec.push_back(gun); 

    vec[0](1); 
    vec[1](2); 
} 

あなたはvoid()機能をバインドするときstd::bindstd::function<void(int)>を返すようにするためにそれが可能だ方法を説明していただけますか?

ファンクタvoid(int)を使用してvoid()の機能を呼び出す方法を教えてください。

+1

ちょうどニットとして:あなたのコードサンプル(vector、iostreams、functional)に必要な '#include'文もすべて提供してください。コピーペーストする方がずっと便利です。 – TemplateRex

答えて

9

functionのテンプレート引数として渡されるシグネチャは、いくつのプレースホルダ(_1)がバインドされるか、およびどのタイプとしてのみ決定されます。

実際の関数の呼び出しには、実際にバインドされた関数が必要とする引数の数だけが使用されます。実際には、余計なパラメータは無視されます。 (?)

別の、より多くの啓発たとえば、他の側から見て:

#include <iostream> 
#include <functional> 

void gun(int i) 
{ 
    std::cout<<"gun("<<i<<")"; 
} 

int main() 
{ 
    using namespace std::placeholders; 
    std::bind(gun, _5)("ignore", 3, "and", 4, 43); 
} 

プリントそれはvoid(int)数子を使用してvoid()関数を呼び出すことが可能ですどのように

​​
+0

私は申し訳ありませんが、これは私の質問に答えることはできません:どのようにstd :: bindは、xのparams関数x + k params std :: functionを作ることができますか?それは、x + kパラメータ関数x params std :: functionからどのようにすることができるかは明らかです。 – Felics

+0

@Felicsは完全にはっきりしていませんが、厳密な答えは "それは実装定義"です - 標準では 'std :: function'がどのように実装されるか、あるいは' std: :bind'。だから、本当に**実装方法**を知りたければ、あなたの実装に行ってください。私はあなたがそれを概念的に尋ねていると思っていました。私はそれに答えました。 – sehe

+0

@Felicsも参照[この質問](http://stackoverflow.com/questions/13251976/why-do-objects-returned-from-bind-ignore-extra-arguments) – TemplateRex

0

std::bind(fun)関数はvoid()関数を返しません。指定されていない型の呼び出しラッパーを返します。

そのコールラッパーを起動する通常の方法は、引数なしの、しかしbind()のほとんどの実装になりますタイプはゼロ以上の引数で呼び出すことができますと追加の引数は無視されます(即ちターゲットに渡しませんより一般的には、Nの引数を取る関数Fするための機能)

は、bind(F)N以上の引数で呼び出すことができるコールラッパーを返します。引数をバインドするかプレースホルダを使用すると、コールラッパーを呼び出すのに必要な引数の最小数が変更されます。

関連する問題