是否有可能创建一个容器,以统一的方式保持不同(捕获)lambda(我们假设它们具有相同的operator()签名)
请不要提供std :: function,因为它使用了不必要的虚函数调用/堆分配(相反,我更喜欢按值复制lambda)
对于非捕获lambdas很容易,因为它们会衰减到函数指针。
我需要做的是:
#include <iostream>
#include <vector>
template <typename F>
class Wrapper {
public:
Wrapper(F f) : func(f) {}
F func;
};
int main()
{
int x = 1;
auto l = [x](int a, float b) {
return a*b+x;
};
auto m = [x](int a, float b) {
return a+b*x;
};
Wrapper<decltype(l)> aa(l);
Wrapper<decltype(m)> bb(m);
std::vector<decltype(aa)> v;
v.push_back(aa);
v.push_back(bb); // no matching member function
}
现在,Wrapper(aa)和Wrapper(bb)的类型不同。所以我需要开发另一个Wrapper来放入std :: vector。 会是什么呢? (没有堆alloc?没有vptr调用?)