我正在经历 T.1的CppCoreGuidelines,并有以下例子
示例 1
template<typename T>
// requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
for (auto x : v) s += x;
return s;
}
示例 2
template<typename T>
// requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
for (auto x : v) s = s + x;
return s;
}
根据上面的指南,示例在概念上是错误的,因为它错过了概括的机会(仅限于“可以增加”或“可以添加”的低级概念)。
如何表达上述模板才能被称为好的通用模板?
最佳答案
坏事在于(评论)概念。它们太具体并且与实现相关联,因为他们声明 Incrementable<T>
仅限于运算符 +=
和 Simple_number<T>
仅适用于 +
和 =
.
它们提供了一个正确的“算术”概念,提供了一套更完整的操作+
, +=
, =
, ...
因此您可以用一个实现替换另一个。
更好的方法是替换 vector<T>
通过“range_view<T>
”。
这里关注的不是实现,而是概念。
STL 中的一些算法依赖于 operator ==
的存在但不需要 operator !=
, 或者需要 operator <
的存在但不是 operator >
, 这使得它们不够通用。
Orderable<T>
的概念比 HaveLess<T>
更通用.
大多数算法都依赖于类型的某些要求,但它是否应该具有逻辑对应部分
关于c++ - 使用模板来提高代码的抽象层次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766994/