目的是std::function什么?据我所知,std::function将函数,仿函数或lambda转换为函数对象.
我不太明白这个的目的...... Lambdas和Functors都已经是函数对象了,我相信它们可以用作排序和转换等算法的谓词.作为旁注,Lambdas实际上是Functors(内部).因此,我唯一能看到std::function的有用的是将常规函数转换为函数对象.
我不太明白为什么我想将常规函数转换为函数对象.如果我想使用一个函数对象,我首先会把它作为一个函子或lambda ...而不是编写一个函数,然后用std :: function转换它,然后将它作为谓词传递给...
我猜测还有更多std::function......乍看之下不太明显的东西.
std::function非常感谢您的解释.
目的是
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- 可能都有不同的具体类型,但我不在乎,我只需要打电话给他们.virtual函数std::function<void()>,但我不能有一个virtual函数模板).考虑一个简单的用例:
/* 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?模板参数?好的,但是它是如何在内部注册的?
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |