【发布时间】:2017-08-19 02:13:44
【问题描述】:
我正在浏览 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;
}
根据上述指南,这些示例在概念上很糟糕,因为它错过了泛化的机会(仅限于“可以增加”或“可以添加”的低级概念)。
如何表达上述模板才能称得上是好的泛化模板?
【问题讨论】:
-
为什么不使用
s = std::accumulate(std::begin(v), std::end(v), s)?适用于任何标准容器(和原版 C 样式数组),不依赖于s和v的元素是同一类型(尽管需要定义添加它们)。我建议它比您的任何一个示例都更通用 -std::accumulate()可用于其他用途。