August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
考虑编写一个操作,它使用两个操作slow_and_safe(T)或simple_and_fast(T)中的一个。这个问题在基础代码中很常见,在这种代码中通用性和选择性能是很重要的。传统的解决方案是编写一对重载函数并基于萃取选取最适合那个(参见13.9.1节),例如标准库的is_pod。如果涉及类层次,基类可以提供slow_and_safe通用操作,而派生类可用一个simple_and_fast实现覆盖它。
在C++17中,可以使用编译时if:
这里is_pod<T>是一个类型萃取(参见13.9.1节),它告诉我们一个类型是否可以简单拷贝。
只有被选中的if constexpr分支才会被实例化。这个解决方案提供了最优性能和优化的局部性。
重要的是,if constexpr不是一种文本处理机制,因此不能用来打破常规的语法、类型和作用域规则。例如:
允许这种文本处理会严重危害代码的可读性,而且会给依赖于现代程序表示技术的工具(例如“抽象语法树”)带来问题。
Read now
Unlock full access