特定类型的范围概念



是否有已经定义的概念,用于在C++20或TS范围中指定特定类型的范围?

类似于:

template < class T, class InnerType >
concept RangeOf =
requires(T&& t) {
requires std::same_as<
std::remove_cvref_t<decltype(*std::ranges::begin(t))>,
InnerType
>;
std::ranges::end(t);
};

允许,例如:

void print(const RangeOf<char> auto& char_seq) { /* ... */ }

没有。

拼写这个特定概念的方法是:

template <typename R, typename V>
concept RangeOf = range<R> && same_as<range_value_t<R>, V>;

但后来发现,你可能也想检查一些非常密切相关的事情。实际上,您可能希望查看reference类型,而不是value_type。也许是:

template <typename R, typename V>
concept RangeOf = range<R> && same_as<range_reference_t<R>, V>;

原因是:你认为vector<char>&char的范围还是char&的范围?可以说,它更像后者,正是后者推动了更多的使用。但前者并不是错的,它也很有用,只是以不同的方式。

然后你必须讨论你想要same_as还是convertible_to。在一些算法中,你可能希望将其限制为前者,而在某些算法中,后者足够好。对我来说,这是想要概念模板参数的动机之一,因此:

template <typename R, template <typename> concept C>
concept RangeOf = range<R> && C<range_value_t<R>>;

这样我就可以很容易地编写RangeOf<same_as<char>>RangeOf<convertible_to<char>>,这取决于我实际想要的内容。


也就是说,很难知道我们想要RangeOf的实际内容,这就是为什么不存在这样的内容。但每一个有用的东西都很容易写,所以缺少这样的东西对用户来说并不是一个特别大的负担。

最新更新