对于 std::ranges::views 结果,使用更明确的类型而不是 auto

问题描述 投票:0回答:1

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
来使类型更清晰吗?

c++ std-ranges
1个回答
0
投票

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
这样的东西了吗?如果存在更好的答案,请回答。

© www.soinside.com 2019 - 2024. All rights reserved.