繁体   English   中英

了解std :: function和std :: bind

[英]Understanding std::function and std::bind

我正在玩std :: function和std :: bind,我注意到一些不直观的东西,我想更好地理解它。

例如:

void fun()
{
}

void hun(std::string) 
{ 
}

int main()
{

   function<void(int)> g = &fun; //This fails as it should in my understanding.

   function<void(int)> f = std::bind(fun); //This works for reasons unknown to me     
   function<void(int, std::string)> h = std::bind(hun); //this doesn't work

return 0;
}

它是如何可以将绑定function<void(int)>到一个函数,是无效的()。 然后我可以调用f(1)并获得乐趣()。 我想了解这是如何完成的。 进入Microsoft Visual Studio 2012的实现,让我迷失在无法理解的宏海中。 所以这就是我在这里问这个问题的原因。

如果不使用参数占位符( _1_2 ,...),那么传递给从std::bind返回的函数对象的任何参数都将被丢弃。 附:

std::function<void(int)> f = std::bind(fun, std::placeholders::_1);

我得到了一个(长而丑陋的)错误。

对于对Standardese感兴趣的人:

§20.8.9.1.2 [func.bind.bind]

template<class F, class... BoundArgs>
*unspecified* bind(F&& f, BoundArgs&&... bound_args);

p3返回:具有弱结果类型(20.8.2)的转发调用包装器g g(u1, u2, ..., uM)应为INVOKE(fd, v1, v2, ..., vN, result_of<FD cv (V1, V2, ..., VN)>::type) ,其中cv表示gcv-限定符并且绑定参数v1, v2, ..., vN的值和类型如下所述确定

p10绑定参数v1, v2, ..., vN及其对应类型V1, V2, ..., VN 取决于从bind调用派生的TiD类型和调用包装器的cv -qualifiers cv g如下:

  • 如果TiDreference_wrapper<T> ,则参数为tid.get() ,其类型ViT& ;
  • 如果is_bind_expression<TiD>::value值为true ,则参数为tid(std::forward<Uj>(uj)...) ,其类型Viresult_of<TiD cv (Uj...)>::type ;
  • 如果is_placeholder<TiD>::value的值j不为零,则参数为std::forward<Uj>(uj) ,其类型ViUj&& ;
  • 否则,该值为tid ,其类型ViTiD cv &

通过调用函数模板bind生成的转发调用包装器可以接受任意数量的额外参数; 这些都会被忽略。 bind表达式的有效arity和最小签名由其构造中使用的placeholder以及它们绑定的可调用参数确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM