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



我正在浏览 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;
}

例 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>仅适用于+=

它们提供了一个正确的"算术">概念,提供了一套更完整的运算++==、...

因此,您可以将一个实现替换为另一个实现。

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

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

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

Orderable<T>的概念比HaveLess<T>更通用。

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

标准库有一个很好的实现: http://en.cppreference.com/w/cpp/algorithm/accumulate

它有两个版本,一个版本采用二进制函子,因此您可以在不operator+的情况下对事物求和。

它需要迭代器,因此您可以对任何可迭代容器求和,而不仅仅是向量。

它允许结果类型与容器的值类型不同。 例如,您可能希望将vector<float>的总和存储在double中以提高精度。

它也永远不会复制值,这比问题中基于范围的for(auto)循环所能说的要多。

相关内容

  • 没有找到相关文章

最新更新