std :: function的解释

cod*_*ode 7 c++ c++11

目的是std::function什么?据我所知,std::function将函数,仿函数或lambda转换为函数对象.

我不太明白这个的目的...... Lambdas和Functors都已经是函数对象了,我相信它们可以用作排序和转换等算法的谓词.作为旁注,Lambdas实际上是Functors(内部).因此,我唯一能看到std::function的有用的是将常规函数转换为函数对象.

我不太明白为什么我想将常规函数转换为函数对象.如果我想使用一个函数对象,我首先会把它作为一个函子或lambda ...而不是编写一个函数,然后用std :: function转换它,然后将它作为谓词传递给...

我猜测还有更多std::function......乍看之下不太明显的东西.

std::function非常感谢您的解释.

Bar*_*rry 9

目的是std::function什么?据我所知,std::function将函数,仿函数或lambda转换为函数对象.

std::function是一个名为Type Erasure的更广泛概念的例子.你的描述不太准确.是什么std::function<void()>呢,选择一个特定的专业化,是代表任何可以不带任何参数调用调用.它可以是具有具体类型的函数指针或函数对象,也可以是由lambda构建的闭包.源类型是什么并不重要,只要它符合合同 - 它才有效.我们不是使用具体的源类型,而是"擦除"它 - 我们只是处理它std::function.

现在,我们为什么要使用类型擦除?毕竟,我们不是有模板,所以我们可以直接使用具体类型吗?那不是更有效率,而不是C++关于效率吗?!

有时,您无法使用具体类型.一个可能更熟悉的例子是常规的面向对象的多态性.为什么Base*我们可以存储一个Derived*什么时候我们可以存储一个?好吧,也许我们不能存储一个Derived*.也许我们有很多Derived*不同用户使用的不同.也许我们正在写一个甚至不知道的图书馆Derived.这也是类型擦除,只是一种不同的技术std::function.

一个非排气用例列表:

  • 当我们只关心它们满足具体的接口时,需要存储一个潜在的异构对象列表.因为std::function,也许我只有一个std::vector<std::function<void()>> callbacks- 可能都有不同的具体类型,但我不在乎,我只需要打电话给他们.
  • 需要跨越API边界使用(例如,我可以有一个virtual函数std::function<void()>,但我不能有一个virtual函数模板).
  • 从工厂函数返回 - 我们只需要一些满足某些概念的对象,我们不需要具体的东西(同样,在OO多态性中也很常见,这也是类型擦除).
  • 可能实际上在任何地方都使用模板,但性能提升不值得编译.


bip*_*pll 6

考虑一个简单的用例:

/* Unspecified */ f = [](int x, int y){ return x + y; };
f = [](int x, int y){ return x - y; };
int a = 42;
f = [&a](int x, int y){ return a * x * y; };
Run Code Online (Sandbox Code Playgroud)

你会如何指定/* Unspecified */

此外,

std::queue<of what?> jobs;
jobs.push_back([]{ std::cout << "Hi!\n"; });
jobs.push_back([]{ std::cout << "Bye!\n"; });
for(auto const &j: jobs) j();
Run Code Online (Sandbox Code Playgroud)

什么value_type应该保持在jobs

最后,

myButton.onClick(f);
Run Code Online (Sandbox Code Playgroud)

有什么类型f?模板参数?好的,但是它是如何在内部注册的?