C 11内联lambda无模板功能

C++11 inline lambda functions without template

本文关键字:功能 lambda 内联      更新时间:2023-10-16

我想将lambda函数作为回调传递给另一个功能:

void test(const std::function<void()> fn){
    fn();
}

它有效,一切都很好。但。无论我使用多高的编译器优化级别,它都不会嵌入式局限性:
证明

,当我玩一会儿时,我发现那是用模板 - 它被内衬的:

template<typename T>     
void test2(T fn){
     fn();
}

Proof_2

那么...是否有任何方法可以将其与模板进行内衬?为什么它会与模板声明一起单行?唯一的函数类型是作为模板参数传递的,而不是函数本身。

简短答案:不,如果没有模板,就无法完成此工作(在一般情况下)。原因是您的源代码中的每个lambda表达式都会为lambda闭合生成唯一类型。证明:

auto f1 = [] { return 1; };
auto f2 = [] { return 1; };
static_assert(!std::is_same<decltype(f1), decltype(f2)>::value, "He's wrong");

因此,要接受任意关闭,您必须使用模板,或者要么使用类型的包装器(例如std::function)。当然,类型擦除依赖于运行时多态性,因此它不适合内在。

您有可能进行这项工作的唯一方法是使用无状态的lambda(无捕获),该lambda具有隐式转换为函数指针。让您的算法将参数作为功能的指针,并希望优化者看到足够深的呼叫。换句话说,将功能更改为:

void test(void (*fn)()) {
    fn();
}