std :: function作为std :: function的参数

问题描述 投票:0回答:1

例如,我可以这样做:

void foo(int i)
{
    std::cout << "fo is called with: " << i << "\n";
}

int main()
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

和输出

fo被称为:5

现在我很好奇我是否可以创建一个接收std :: function作为参数的std ::函数,所以我想到了一些函数:

void foAndFo(function<void(int)> foo)
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

但这甚至不能编译。

现在我改成了可以调用函数指针的东西。

using foType = void(*)(int);
void foAndFo(foType foo)
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

现在它可以编译。但是现在我不能std :: bind就像:

int main()
{
std::function<foType> fo2 = std::bind(&foAndFo,std::placeholders::_1); //error
}

是否可以使用std :: function作为std :: function的参数?

c++11 std-function
1个回答
2
投票

这个有可能。在&之前放下foo

void foAndFo(function<void(int)> fo)
{
    std::function<void(int)> fo = std::bind(/*&*/foo, std::placeholders::_1);
    fo(5);
}

不同的是,如果foovoid(int)foo&foo都可以插入预期功能的地方。另一方面,如果foostd::function然后两者是完全不同的:foo可以通过const std::function&,但&foostd::function*,指向std::function类型的对象。后者不是Callable。

最小的工作示例:

#include <iostream>
#include <functional>

void foo(int i)
{
    std::cout << "fo is called with: " << i << "\n";
}

int main()
{
    std::function<void(int)> fo = std::bind(foo, std::placeholders::_1); // or &foo, both work
    std::function<void(int)> fo2 = std::bind(fo, std::placeholders::_1); // Error if &fo is used
    fo2(5);
}
© www.soinside.com 2019 - 2024. All rights reserved.