(这个问题已经从原来的问题中进行了戏剧性的编辑,没有改变原始问题的真正意图)
如果我们将 vector<int>
中的所有元素相加,那么答案可能会溢出,需要像 intmax_t
这样的东西以准确和不溢出存储答案。但是intmax_t
不适合 vector<double>
.
我可以手动指定类型:
template<typename>
struct sum_traits;
template<>
struct sum_traits<int> {
typedef long accumulate_safely_t;
};
然后按如下方式使用它们:
template<typename C>
auto sum(const C& c) {
sum_traits<decltype(c.begin())> :: accumulate_safely_t> r = 0;
for(auto &el: c)
r += el;
return r;
}
我的问题:是否可以自动识别一个合适的类型,一个大而准确的类型,这样我就不必通过类型特征手动指定每个类型?
最佳答案
您的代码的主要问题是 auto r = 0
等同于 int r = 0
。那不是你的 C++98 代码的工作方式。一般来说,你找不到完美的目标类型。您的代码只是 std::accumulate
的一个变体,所以我们可以看看标准是如何解决这个问题的:它允许您传入累加器的初始值及其类型:long sum = std::accumulate(begin, end, long{0});
关于c++ - 自动识别合适的类型,足够大且足够精确,以保存容器中所有元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385263/