对于概念,我们可以要求模板参数符合概念,例如在:
template<ForwardIterator A>
struct S { A a; };
我们将struct S
参数化为类型为A
的类型,我们需要符合概念ForwardIterator
。然后我们可以实例化S<std::vector<int>::iterator>
,但不能实例化,例如S<std::vector<int>>
。
我的问题与在上述情况下将用于代替T
的具体类型A
的定义有关:*我们能否声明类型T
符合{ {1}}在定义时就已经存在,没有实例化ForwardIterator
?
答案 0 :(得分:1)
从语言上讲,concept
定义创建一个constexpr
bool
变量模板。由于概念的实例化是constexpr
变量,因此可以在static_assert
语句中使用它。因此,如果您已经声明了某种类型T
,并希望基于所有可访问的声明来验证其是否适合概念C
,则可以进行static_assert(C<T>);
。
当然,许多概念并不是那么简单。许多概念限制了多个参数。他们表达了多种类型之间的关系。您不应该以这种OOP /继承方式来限制对概念的思考。