C++ 特定类型的范围概念

C++ 特定类型的范围概念,c++,range,c++20,c++-concepts,C++,Range,C++20,C++ Concepts,在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))>, InnerTyp

在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);
  };
模板
范围概念=
需要(T&T){
需要std::与相同的_<
标准::移除cvref t,
内型
>;
标准::范围::结束(t);
};
允许:

void打印(const RangeOf auto&char\u seq){/*…*/}
不,没有

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

模板
概念RangeOf=范围与相同;
但后来发现,有一大堆非常密切相关的事情,你可能也想检查一下。实际上,您可能希望查看
引用
类型,而不是
值类型
。也许是这样的:

模板
概念RangeOf=范围与相同;
原因是:你认为<代码> vector和<代码>是一个范围> <代码> char < /> >还是一个范围> <代码> char和< /代码>?可以说,它更像后者,而后者推动了更多的使用。但前者并不是错的,它也是有用的,只是以不同的方式

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

模板
概念范围=范围和范围&C;
这样我就可以轻松地编写
RangeOf
RangeOf
,具体取决于我实际需要的内容



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

当您使用您展示的概念时会发生什么?@cigien该概念允许匹配特定内部类型的范围,例如字符范围,问题是这样一个概念是否已经被提出或定义。好的,然后编辑你的问题,以明确代码是否有效,并且你在问STL中是否已经有这样一个概念。将它留给用户并不意味着用户会记住你提出的所有强有力的论点和细微差别,因此,用户可能会实现一些忽略了您提出的细微差异的东西。对我来说,
RangeOf
RangeOf
的想法听起来很棒,是不是考虑过?或者这也是留给用户的?@AmirKirsh“有力的论据和细微差别”只是。。。所讨论的算法需要什么。有些算法需要一件事,而另一些则需要另一件事。编写算法的用户应该知道算法需要哪个约束,并使用合适的约束。我不认为这里有一个普遍的答案。@AmirKirsh,我们没有概念模板参数作为语言功能,这就是为什么我把它描述为想要这样一个东西的动机。我不知道你问这是否留给用户是什么意思。问题是
RangeOf
RangeOf
是否是表上的内容(例如,对于C++23?),还是建议作为用户可以实现的事情的示例。我理解是后者。@AmirKirsh用户无法实现这一点,这需要语言的改变。我现在还不知道有这样的提议。
void print(const RangeOf<char> auto& char_seq) { /* ... */ }