类型擦除:原理、挑战与优化
1. 类型擦除概述
类型擦除可以通过大约 30 行代码实现,但它可能会让人感觉过于复杂。当超出基本实现,开始考虑性能、异常安全等问题时,实现细节会变得非常棘手。在这种情况下,使用第三方库是最安全和便捷的选择,例如 Louis Dionne 的 dyno 库、Eduardo Madrid 的 zoo 库、Gašper Ažman 的 erasure 库以及 Steven Watanabe 的 Boost Type Erasure 库。
2. 类型擦除的缺点
2.1 不适合二元操作
类型擦除在处理二元操作时存在局限性,例如进行相等性比较。以下是一个示例:
int main()
{
// ...
if( shape1 == shape2 ) { /*...*/ } // 编译失败!
return EXIT_SUCCESS;
}
原因在于 Shape 只是具体形状类型的抽象,仅存储了一个基类指针。虽然在处理基类指针时,相等性比较并非预期操作,但在处理值时,这通常是预期操作。
2.2 比较两个类型擦除包装器
有人可能会想,是否可以在 Shape 的接口中暴露必要的功能来进行比较,例如添加 area() 函数:
bool operator==( Shape const& lhs, Sha
超级会员免费看
订阅专栏 解锁全文
1628

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



