使用std :: function的优点

时间:2016-06-07 05:58:09

标签: c++ c++11 c++14

亲爱的stackoverflow用户。

我试图找到std::function的优点,以及为什么我应该使用它来代替函子或函数指针。可悲的是,我找不到令人满意的答案。

这就是为什么我会非常感谢你能告诉我std::function的优点是什么,以及何时使用它。希望我的问题能够帮助其他人。

2 个答案:

答案 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>

此外,在某些情况下,甚至制作所有模板都无济于事;考虑使用可以调用的异构“东西”的向量,例如类似信号的对象。没有这种类型的擦除,它基本上是不可能的。

相关问题