std::function和std::bind的行为

5

我有这段代码:

#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::bind 如何返回 std::function<void(int)>

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


1
只是一点小问题:请在您的代码示例中提供所有必要的 #include 语句(vector,iostreams,functional)。这样复制粘贴会更方便。 - TemplateRex
2个回答

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

打印

gun(43)

很抱歉,这并没有回答我的问题:std::bind如何将x个参数的函数变成x+k个参数的std::function?显然它可以将x+k个参数的函数变成x个参数的std::function。 - Mircea Ispas
@Felics,坦白地说,严格的答案是:“这是实现定义的” - 标准没有指定如何实现std::function,或者std::bind的返回类型。因此,如果您真的想知道它是如何实现的,请查看您的实现。我认为您是在概念上询问它,而我认为我已经回答了这个问题。 - sehe
@Felics 请参考这个问题 - TemplateRex

0
如何使用void(int) 函数对象调用void()函数? std::bind(fun) 不返回一个void() 函数,而是返回一个未指定类型的调用包装器。
通常调用该调用包装器的方式是不带参数,但在bind()大多数实现中,该类型可以使用零个或更多个参数进行调用,并且附加的参数将被忽略(即不传递给目标函数)。
更一般地,对于一个接受N个参数的函数Fbind(F)返回一个调用包装器,可以使用N个或更多个参数进行调用。如果绑定参数或使用占位符,则会改变调用包装器所需的最小参数数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接