理解的std ::功能和std ::绑定(Understanding std::function a

2019-08-31 21:25发布

我是打以防万一用的std ::功能和std ::绑定,我发现了一些非直观的,我想更好地理解它。

例如:

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),并得到乐趣()。 我想知道如何做到这一点。 微软的Visual Studio 2012的落实这里面去了我在不可读宏的海上失踪。 所以这就是为什么我在这里问这个问题。

Answer 1:

如果不使用参数占位符( _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返回:一个转发呼叫包装g具有弱结果类型(20.8.2)。 的效果g(u1, u2, ..., uM)INVOKE(fd, v1, v2, ..., vN, result_of<FD cv (V1, V2, ..., VN)>::type) ,其中,CV代表的CV -qualifiers g 和结合的参数的值和类型v1, v2, ..., vN被如下规定确定

P10结合的参数的值v1, v2, ..., vN和对应的类别V1, V2, ..., VN 取决于类型TiD从呼叫衍生bindCV -qualifiers呼叫包装的CV g如下:

  • 如果TiDreference_wrapper<T>该参数被tid.get()和它的类型ViT& ;
  • 如果值is_bind_expression<TiD>::valuetrue时,参数为tid(std::forward<Uj>(uj)...)和它的类型Viresult_of<TiD cv (Uj...)>::type ;
  • 如果该值jis_placeholder<TiD>::value不为零时,该参数是std::forward<Uj>(uj)和它的类型ViUj&& ;
  • 否则,该值是tid和它的类型ViTiD cv &


Answer 2:

通过调用生成函数模板转发调用包装bind可以接受任何数量的额外的参数; 这些将被忽略。 一个的有效元数和最小的签名bind表达由所确定的placeholder在其构造中使用S,且可调用的参数(一个或多个)它们所键合。



文章来源: Understanding std::function and std::bind