例如,我可以这样做:
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的参数?
这个有可能。在&
之前放下foo
:
void foAndFo(function<void(int)> fo)
{
std::function<void(int)> fo = std::bind(/*&*/foo, std::placeholders::_1);
fo(5);
}
不同的是,如果foo
是void(int)
,foo
和&foo
都可以插入预期功能的地方。另一方面,如果foo
是std::function
然后两者是完全不同的:foo
可以通过const std::function&
,但&foo
是std::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);
}