auto
维护单一定义并避免一些打字真的很好。对于std::ranges::views
来说也是必要的。但是,如果距离定义类型太远,auto
会使代码更难阅读(尤其是在代码审查中)。用显式类型替换它还可以验证该类型是否是您所期望的类型(例如,在将其传递给模板化函数并陷入模板错误消息伤害的世界之前)。需要有一个平衡。不幸的是, auto
对于 views
是必需的(我认为因为该类型依赖于实现)。
#include <ranges>
// Provided in some other header
template<class Range>
auto process(Range&& range)
{
return range | std::ranges::views::transform(&Foo::i);
}
// main.cpp
struct Foo { int i; };
void func()
{
Foo foos[4];
// What is result and what can you do with it?
auto result = process(foos);
}
有什么我可以替换
auto
来使类型更清晰吗?
auto
可以用C++概念来约束
template<typename Range, typename T>
concept range_of = std::same_as<std::ranges::range_value_t<Range>, T>;
...
range_of<int> auto result = process(foos);
// range_of<float> auto result = process(foos); // error. thanks, compiler!
后续问题。我不知道,但是标准库中已经有像
range_of
这样的东西了吗?如果存在更好的答案,请回答。