2013-04-23 82 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); 
} 

能否请你解释它是如何可能为std::bind返回std::function<void(int)>结合void()功能时?

如何通过使用void(int)函子来调用void()函数?

+1

就像一个挑剔的人:请在代码示例中提供所有必要的'#include'语句(vector,iostreams,functional)。使复制粘贴更加方便。 – TemplateRex 2013-04-23 06:37:25

回答

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); 
} 

打印

​​
+0

对不起,但这不回答我的问题:如何std :: bind可以使x参数函数x + k params std :: function?很明显,它是如何从x + k params函数x params std :: function中产生的。 – Felics 2013-04-23 08:20:15

+0

@Felics是完全钝的,严格的答案是:“这是实现定义的” - 标准没有指定如何实现'std :: function',或者就此而言,返回类型为'std: :bind'。所以如果你真的想知道**它是如何实现的,请转到你的实现。我以为你在概念上问这个问题,我想我回答了这个问题。 – sehe 2013-04-23 08:48:46

+0

@Felics另请参阅[这个问题](http://stackoverflow.com/questions/13251976/why-do-objects-returned-from-bind-ignore-extra-arguments) – TemplateRex 2013-04-23 09:12:59

0

它是如何通过使用void(int)仿函数调用void()功能?

std::bind(fun)不返回void()函数,它返回未指定类型的调用包装。

的常用方法来调用调用包装将与零个参数,但在bind()大多数实现该类型可以零个或多个参数来调用和其他参数将被忽略(即不传递到目标功能)

更一般地,采取N参数的函数Fbind(F)返回调用包装可以与N或多个参数来调用。如果绑定参数或使用占位符,则会改变调用调用包装器所需的最小参数数量。