特定类型的范围概念

2022-05-17 00:00:00 range c++ c++20 c++-concepts

是否已定义概念,用于在C++20或Range-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);
  };

要允许,for example:

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


所有这一切都是说,很难知道我们真正想要的东西是什么,这就是为什么不存在这样的东西。但每个有用的具体内容都很容易编写,因此缺少这样的内容对用户来说并不是一个特别大的负担。

相关文章