现代C++特性与SeqAn3设计
1. 定制点相关内容
1.1 传统定制方式的问题
在对类型进行定制时,传统方式存在一些问题。比如,当用户想要从一个自己不拥有的命名空间(如第三方库)中适配类型时,可能无法满足ADL(依赖实参的查找),因为需要打开该类型的命名空间。而且,调用方式相互排斥,无法为用户提供多种定制选项,例如不能让一些用户定义成员函数,而另一些用户添加自由函数。无限制查找虽然能执行ADL,但不能回退到特定实现,如 std::swap() (如果 std 不是参数的关联命名空间)。虽然有解决办法,如 using std::swap; swap(a, b); ,但这种方法难以教授且容易出错,在概念中也无法使用,而概念在现代C++的定制点中经常使用。
1.2 “Niebloids”设计
Eric Niebler引入的“Niebloids”设计解决了上述大部分问题,其核心方面如下:
1. 创建函数对象作为定制点
- 通用代码总是通过限定查找来调用这个函数对象,例如 library::swap 甚至 ::library::swap ,最初不考虑其他重载。
- 函数对象不受ADL影响,防止函数对象自调用或被意外调用。
2. 精心设计重载集
- 开发者通过在函数对象中定义多个具有所需行为的 operator() 来专门创建所需的重载集,这些
超级会员免费看
订阅专栏 解锁全文
40

被折叠的 条评论
为什么被折叠?



