CppCoreGuidelines T.10 对每个模板参数指定 concept
29 August 2023
“Specify concepts for all template arguments”
理由
更好的正确性和可读性。模板参数准确的语法和语义定义是模板接口的基础。概念(Concept)可以动态提升模板的意义,改进模板的错误处理。给模板参数指定概念是很强大的设计工具。
例子
template<typename Iter, typename Val> requires input_iterator<Iter> && equality_comparable_with<iter_value_t<Iter>, Val> Iter find(Iter b, Iter e, Val v) { // ... }
或者等价的,更严格的方式:
template<input_iterator Iter, typename Val> requires equality_comparable_with<iter_value_t<Iter>, Val> Iter find(Iter b, Iter e, Val v) { // ... }
注意
普通的 typename
或 auto
是限制最少的概念。只有在限制最少的情况下使用,标识这仅仅是一个类型。只有在我们纯粹的表达某种表达式树、延迟类型检查的时候才会用到。
参考:TC++PL4
强化
- 标记没有添加 concept 的模板类型。