C++闭包二
摘要
本文深入探讨了C++闭包的概念及其实际应用,结合作者开发的tinylib库中的tiny_match模块,展示了如何利用闭包简化代码设计并隐藏实现细节。通过一个Query类的示例,作者演示了闭包如何捕获局部变量(如match_op),并将其封装为类成员函数,从而避免在类中声明复杂的模板类型。此外,闭包的特性使得局部变量对外部不可见,提升了代码的可维护性和扩展性。文章还强调了闭包在隐藏实现细节和提供灵活接口方面的优势,适合对C++高级特性感兴趣的开发者参考。
“多年以前"写过一篇关于C++闭包的文章,现在看来基本是关于lambda的介绍。随着经验的增加,对闭包的理解更加深刻。在上一篇文章中,介绍了我编写的一个tiny_cmdline库,随后我对一些tiny库更感兴趣,便想着做了一个集合,取名为tinylib,其中有一个tiny库是关于match的。调用方式如下:
| |
考虑到case key的各种类型兼容,目前的match类是运行时构建的,并且是一个模板类(key的类型是各种各样的)。
如果在实际使用中,比如有某个query接口,是不会考虑在query接口中频繁构建match类的,一般会在构造或者其他初始化接口中构造一次,然后在query接口中多次调用。
但是针对match构造一次的情况,如何保存呢?不可能考虑在类的成员变量中写一长串的类型,并且这样也不适合match的扩展。
用闭包可以解决这问题,闭包的一个特点是可以隐藏一些局部变量:
| |
这样,Query类通过保存一个闭包函数,避免在类中声明可变长参数的match类型。
并且,也能发现可以在query.h声明文件中,隐藏tiny_match.h的头文件,只需要在query.cpp中包含即可。
tiny_match.h的实现在: https://github.com/caibingcheng/tinylib/blob/master/tiny_utility/tiny_match.h
根据match这个案例, 再来理解闭包这个概念:
- 可以捕获上层函数的局部变量, 比如
match_op_捕获了match_op - 可以隐藏局部变量, 比如
match_op, 外部通过某些接口访问match_op_时, 是无法感知match_op的存在的 - 通过2, 闭包可以隐藏实现细节
- 一个"神奇"的通道, 外部接口居然可以访问到内部的局部变量, 尽管是这个局部变量的复制体