现在已经有很多问题了(例如:C++ Concepts : CRTP)但答案并没有真正说明如何解决潜在的问题。
我想递归地定义一个概念。大致如下。如果类型是整数,则它对concept_0
进行建模。如果一个类型是concept_n
元素的范围,则该类型对concept_{n+1}
进行建模。我想像下面这样的东西编译
template <typename R>
concept my_object = std::integral<R> || (std::ranges::sized_range<R> && my_object<typename R::value_type>);
有没有办法做到这一点?
3条答案
按热度按时间knpiaxh11#
AFAIK,概念不允许递归。但是模板可以,所以为了让你的例子工作,你可以写一个模板类来建模你的概念,然后把你的概念定义为一个薄薄的 Package 器:
https://godbolt.org/z/1fqKzrYGh
wpx232ag2#
用老式的方法来做:
(This定义将在
my_object<int[2]>
上失败;解决这个问题很容易)。aor9mmx13#
你的类型trait实际上并不需要三个模板定义来实现这个概念,因为只有两种情况需要处理。此外,使用
std::ranges::range_value_t<R>
而不是typename R::value_type
还允许您检查C风格的数组类型。https://godbolt.org/z/5Krb6cosv