C 11内联lambda无模板功能
C++11 inline lambda functions without template
我想将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();
}
相关文章:
- "lambda capture"正常功能?
- 传递具有移动捕获功能的 lambda
- Lambda的功能C++奇怪的行为
- 将带捕获功能的 lambda 传递给模板化函数
- 基于lambda arity的专门功能模板
- 使用lambda在功能指针铸造时双免费
- 如何将功能机体转换为lambda
- 如何在C 中调用此lambda功能
- 如何将通用lambda传递到功能中
- 为什么在传递lambda而不是功能指针时不能推断模板参数
- 如何使用C lambda将成员功能指针转换为普通功能指针,以用作回调
- 如何将lambda功能传递给通用参数作为参数
- 未评估上下文中的默认模板参数和 lambda:错误还是功能?
- 为什么我的按钮类项目共享相同的lambda功能
- 用C 中的lambda替换功能
- Lambda通过参考传递的功能
- 如何否定lambda功能结果
- 如何更新嵌套lambda功能(C )中的变量
- C lambda作为班级成员的功能:奇怪的行为
- 尝试在静态功能(C )中使用lambda函数