this answer 我写了 C++17 代码:

cout << accumulate(cbegin(numbers), cend(numbers), decay_t<decltype(numbers[0])>{});

这收到了关于C的性质一些负面评论++的类型关联,这一点我很伤心地说,我同意:(
decay_t<decltype(numbers[0])>{} 是一种非常复杂的获取方式:



是否可以保持与 numbers ' 元素类型的关联,但不能输入 30 个字符来获取它?

编辑:

我有很多答案涉及 accumulate 的包装器或从 numbers[0] 中提取类型。问题是它们要求读者导航到次要位置以阅读不比初始化代码 decay_t<decltype(numbers[0])>{} 复杂的解决方案。

我们必须做的比这更多的唯一原因: decltype(numbers[0]) 是因为 array subscript operator 返回一个引用:



有趣的是,关于 decltype 的论点:



但是, decltype((numbers[0])) 仍然只是对 numbers 元素的引用。所以最终这些答案可能会尽可能地简化这个初始化:(

最佳答案

虽然我总是选择按照@Barry 编写一个辅助函数,
如果 numbers 是标准容器,它将导出 value_type 类型,因此您可以节省一点复杂性:

cout << accumulate(cbegin(numbers), cend(numbers), decltype(numbers)::value_type());

更进一步,我们可以定义这个模板函数:
template<class Container, class ElementType = typename Container::value_type>
constexpr auto element_of(const Container&, ElementType v = 0)
{
    return v;
}

这给了我们这个:
cout << accumulate(cbegin(numbers), cend(numbers), element_of(numbers, 0));

关于c++ - 是否有 decltype 的快捷方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36268132/

10-14 07:48