如何在多态包装器/容器中存储一组lambda(没有std :: function)

时间:2017-12-16 07:02:36

标签: c++ templates lambda stl

是否有可能创建一个容器,以统一的方式保持不同(捕获)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调用?)

0 个答案:

没有答案