【问题标题】:Range concept for a specific type特定类型的范围概念
【发布时间】:2020-10-06 14:44:44
【问题描述】:

在 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);
  };

允许,for example:

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

【问题讨论】:

  • 当你使用你所展示的概念时会发生什么?
  • @cigien 该概念允许匹配特定内部类型的范围,例如字符范围,问题是这样的概念是否已经提出或定义。
  • 好的,然后编辑您的问题以明确代码有效,并且您在询问 STL 中是否已经存在这样的概念。

标签: c++ range c++20 c++-concepts


【解决方案1】:

没有。

拼写该特定概念的方法是:

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&lt;char&gt;&amp;char 的范围还是char&amp; 的范围?可以说,它更像是后者,而后者推动了更多的使用。但不是前者错,它也有用,只是方式不同。

那你得谈谈你要same_as还是convertible_to。在某些算法中,您希望将其限制为前者,而在某些算法中,后者足够好。对我来说,这是需要概念模板参数的动机之一,因此:

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

这样我就可以轻松写出RangeOf&lt;same_as&lt;char&gt;&gt;RangeOf&lt;convertible_to&lt;char&gt;&gt;,这取决于我真正想要的内容。


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

【讨论】:

  • 把它留给用户并不意味着用户会记住你提出的所有强有力的论点和细微差别,因此可能是用户会实施一些错过你的细微差别的东西增加。 RangeOf&lt;same_as&lt;char&gt;&gt;RangeOf&lt;convertible_to&lt;char&gt;&gt; 的想法对我来说听起来很棒,是否考虑过?或者这也是留给用户的?
  • @AmirKirsh “强有力的论据和细微差别”只是……有问题的算法需要什么。有些算法需要一件事,有些算法需要不同的东西。编写算法的用户应该知道算法需要哪个约束并使用适当的约束。我不认为这里有一个普遍的答案。
  • @AmirKirsh 而且我们没有概念模板参数作为语言功能,这就是为什么我将其描述为想要这样的东西的动机原因。我不知道你问这个是否留给用户是什么意思。
  • 问题是RangeOf&lt;same_as&lt;char&gt;&gt;RangeOf&lt;convertible_to&lt;char&gt;&gt; 是否已经存在(例如对于C++23?),还是作为用户可以实现的示例而提出的.我理解是后者。
  • @AmirKirsh 用户无法实现,需要更改语言。我现在知道没有这样的提议。
猜你喜欢
  • 2014-04-14
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多