【问题标题】:std::function and std::bind behaviorstd::function 和 std::bind 行为
【发布时间】:2013-04-23 06:25:28
【问题描述】:

我有这个代码:

#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 在绑定void() 函数时如何返回std::function&lt;void(int)&gt;

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

【问题讨论】:

  • 就像一个挑剔的人:还请在您的代码示例(向量、iostreams、功能)中提供所有必要的#include 语句。使复制粘贴更加方便。

标签: c++ c++11 stl


【解决方案1】:

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

打印

gun(43)

【讨论】:

  • 很抱歉,但这并不能回答我的问题:std::bind 如何使 x 参数函数 x+k 参数 std::function?很清楚它是如何从 x+k params function x params std::function 生成的。
  • @Felics 直言不讳,严格的答案是:“这是定义的实现” - 标准没有指定如何实现 std::function,或者,就此而言,返回类型的std::bind。因此,如果您真的想知道如何它是如何实现的,请转到您的实现。我以为你是在概念上问这个问题,我想我已经回答了。
  • @Felics 另见this question
【解决方案2】:

如何使用void(int) functor 调用void() 函数?

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

调用该调用包装器的通常方法是使用零参数,但在bind() 的大多数实现中,可以使用零个或多个参数调用该类型,并且将忽略其他参数(即没有传递给目标函数)

更一般地,对于带有N 参数的函数Fbind(F) 返回一个可以使用N 或更多参数调用的调用包装器。如果您绑定参数或使用占位符,那么它将改变调用调用包装器所需的最小参数数量。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2019-02-20
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多