c++20 概念:我们可以将结构声明为符合概念吗?
c++20 concepts: Can we declare a struct as conforming to a concept?
有了概念,我们可以要求模板参数符合一个概念,例如在:
template<ForwardIterator A>
struct S { A a; };
我们用类型 A
参数化 struct S
,我们需要它符合概念 ForwardIterator
。那么我们可以实例化S<std::vector<int>::iterator>
而不实例化,比如S<std::vector<int>>
.
我的问题与具体类型 T
的定义有关,在上述情况下将用于代替 A
: *我们可以声明一个类型 T
以符合到 ForwardIterator
已经在其定义时,没有实例化 S<T>
?
从语言上讲,concept
定义会创建一个 constexpr
bool
变量模板。由于概念的实例化是一个 constexpr
变量,您可以在 static_assert
语句中使用它。因此,如果您已经声明了某种类型 T
并且在某个时候想要验证它是否符合基于所有可访问声明的概念 C
,那么您可以执行 static_assert(C<T>);
.
当然,很多概念并不是那么简单。许多概念约束多个参数;他们表达了多种类型或其他类型之间的关系。你不应该以这种 OOP/inheritance 的方式限制你对概念的思考。
有了概念,我们可以要求模板参数符合一个概念,例如在:
template<ForwardIterator A>
struct S { A a; };
我们用类型 A
参数化 struct S
,我们需要它符合概念 ForwardIterator
。那么我们可以实例化S<std::vector<int>::iterator>
而不实例化,比如S<std::vector<int>>
.
我的问题与具体类型 T
的定义有关,在上述情况下将用于代替 A
: *我们可以声明一个类型 T
以符合到 ForwardIterator
已经在其定义时,没有实例化 S<T>
?
从语言上讲,concept
定义会创建一个 constexpr
bool
变量模板。由于概念的实例化是一个 constexpr
变量,您可以在 static_assert
语句中使用它。因此,如果您已经声明了某种类型 T
并且在某个时候想要验证它是否符合基于所有可访问声明的概念 C
,那么您可以执行 static_assert(C<T>);
.
当然,很多概念并不是那么简单。许多概念约束多个参数;他们表达了多种类型或其他类型之间的关系。你不应该以这种 OOP/inheritance 的方式限制你对概念的思考。