亲爱的stackoverflow用户。
我试图找到std::function
的优点,以及为什么我应该使用它来代替函子或函数指针。可悲的是,我找不到令人满意的答案。
这就是为什么我会非常感谢你能告诉我std::function
的优点是什么,以及何时使用它。希望我的问题能够帮助其他人。
答案 0 :(得分:5)
std::function
实现了一项名为 type-erasure 的技术,因为您可以在<{1}中存储 任何可调用实体无论是仿函数,成员函数还是自由函数 - 你甚至可以存储 成员数据,这似乎是反直觉的!
以下是一个示例,如果没有std::function
(或 type-erasure )则无法完成:
std::function
这是另一个存储 member-data 的例子:
std::vector<std::function<void()>> funs;
for(int i = 0; i < 10; ++i)
funs.push_back([i] { std::cout << i < std::endl; });
for(auto const & f: funs)
f();
输出(demo):
struct person
{
std::string name;
};
int main()
{
std::vector<person> people {
{"Bjarne"},
{"Alex"}
};
std::function<std::string(person const&)> name (&person::name);
for(auto const & p : people)
std::cout << name(p) << std::endl;
}
希望有所帮助。
答案 1 :(得分:1)
std::function
的要点是通过一些给定的原型提供对通用可调用对象的类型擦除。当你想要你的函数/你的类/什么来接收一些具有特定签名的通用可调用对象(无论是函数指针,函子还是lambda)时,你可以使用它而不必在这种可调用的类型上创建所有模板。 / p>
此外,在某些情况下,甚至制作所有模板都无济于事;考虑使用可以调用的异构“东西”的向量,例如类似信号的对象。没有这种类型的擦除,它基本上是不可能的。