将lambda传递到lambda回调参数

passing lambda to a lambda callback parameter

本文关键字:lambda 回调 参数      更新时间:2023-10-16

我正在使用C 14,并且有一个用例,必须有效地执行此操作:

template <typename F>
void foo (F&& fun)
{
    auto l = []()->int
    {
        return 20;
    };
    fun(l);
}
int main ()
{
    auto l = [] (auto& a)
    {
        std::cout << "Hello function: " << a() << std::endl;
        // 'a' has to be copied to a queue optionally
    };
    foo(l);
}

,但是foo()内部调用了100万个功能 - 使用回调'fun'。我不能将所有代码放入标头文件中。保持foo()定义和DOT CPP文件中调用函数的最简单方法可能是将foo()更改为

void foo (std::function< void(std::function<int(void)>) > fun)

但这太效率了,我不希望任何内存分配。这里将有许多创建" fun",然后在每个呼叫" fun(...)"的情况下之一。现在,可以使用此处提到的功能_REF之类的内容来优化外部std ::函数。https://vittorioromeo.info/index/blog/passing_functions_to_functions.html#fn_view_impl

但是内部std ::功能,不能是因为必须"可选地"复制为队列。现在,我该如何在没有内存分配的情况下使这项工作 - 与使用模板一样接近性能。[一种方法是拥有带有固定内部存储的std ::功能之类的东西。]但是,我有一种方法来抛出更多模板以实现我想要的东西。或某种方式更改界面以具有更多相同效果的方法。

不确定这是否是您要寻找的,但也许可以帮助您。

#include <iostream>
#include <deque>
#include <memory>
struct lambdaHolderBase {
    virtual int operator()() = 0;
};
template <typename T>
struct lambdaHolder : lambdaHolderBase {
    lambdaHolder(T tf) : t(tf) {}
    T& t;
    int operator()() override { return t(); }
};
template <typename F>
void foo (F&& fun)
{
    auto l = []()->int
    {
        return 20;
    };
    lambdaHolder<decltype(l)> l2(l);
    fun(l2);
}
int main ()
{
    auto l = [] (auto& a)
    {
        static std::deque<lambdaHolderBase*> queue;
        std::cout << "Hello function: " << a() << std::endl;
        queue.emplace_back( &a );
        // 'a' has to be copied to a queue optionally
    };
    foo(l);
}