使用模板来提高代码的抽象级别?

Har*_*ngh 7 c++ cpp-core-guidelines

我正在浏览CppCoreGuidelines的T.1,并且有以下示例

例1

template<typename T>
    // requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
    for (auto x : v) s += x;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

例2

template<typename T>
    // requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
    for (auto x : v) s = s + x;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

根据上面的指南,这些例子在概念上是不好的,因为它错过了泛化的机会(受限于"可以递增"或"可以添加"的低级概念).

如何表达上述模板才能被称为良好的通用模板?

Jar*_*d42 5

不好的是(评论)概念.它们太具体而且与实现相关联,因为它们声明Incrementable<T>仅限于运算符+=Simple_number<T>仅限于+=.

它们提供的正确的观念"算术"它提供了一套较为完整的操作+,+=,=,...

所以你可以用另一个替换一个实现.

更好的是用vector<T>" range_view<T>" 代替.

这不是这里所关注的实现,而是概念.

STL的一些算法依赖于存在operator ==但不需要operator !=,或者需要存在operator <但不存在operator >,这使得它们不够通用.

概念Orderable<T>比更通用HaveLess<T>.

大多数算法依赖于类型的某些要求,但是它应该具有逻辑对应部分