在 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/