c++ - 自动识别合适的类型,足够大且足够精确,以保存容器中所有元素的总和

标签 c++ c++11 auto decltype

(这个问题已经从原来的问题中进行了戏剧性的编辑,没有改变原始问题的真正意图)

如果我们将 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/

相关文章:

c++ - 在 C++ 中,单例(静态实例)一旦程序退出就会被销毁的原因是什么

c++ - FastDelegate 的 Variadic 版本和额外的值拷贝

swift - 编辑-如何让 UIlabel 进入容器中间?

c++ - 从终端访问数据

c++ - 并行线程中的数据库访问,可行的选择?

c++ - 带有大列表的 STL set_union

c++ - 在 STL 算法中移动迭代器

c++ - 如何最好地将 emplace 与 std::map 一起使用

c++ - 是否有编译器警告是 Visual Studio 2013 检测复制的引用而不是通过引用分配的引用

c++ - 使用 Clang 的函数原型(prototype)中不允许使用“自动”