c++ - 使用模板来提高代码的抽象层次?

标签 c++ cpp-core-guidelines

我正在经历 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/

相关文章:

c++ - 如何使用 C++ Expects 运算符?

c++ - 是否有可以与 GCC 4.9.x 一起使用的 GSL 实现?

c++ - gsl::span - 指向结束的指针

c++ - 仅用 10 万个存储单元对 100 万个数字进行排序

c++ - 如何将二进制数据写入文件以便可以快速读回?

c++ - CreateProecssAsUser 提升权限?

c++ - 如何将备忘录应用于此递归函数?

c++ - boost::any_range<gsl::string_span<>> 在 Release模式下崩溃

c++ - C++ 中类型的单位

c++ - Q_OBJECT 宏有什么作用?为什么所有 Qt 对象都需要这个宏?