在老版本的C++中可以在模板中使用静态断言static_assert来判断模板参数类型的合法性,使用std::is_base_of(c++11)来判断类型继承关系。
static_assert(std::is_base_of<TBase, T>::value)
使用静态断言的问题就是只会在编译器对模板实例化时才会进行静态断言,没办法在开发中就知道是否有错误。
但是使用cpp2-中引入的concept,可以使用约束运算结果来匹配模板,可以解决这个问题。
在cpp20中引入了concept,使用requires来对模板进行约束,当requires的表达式为true时才能成功匹配,如果传入的T类型不继承于Base将会抛出编译错误。
继承约束
template<typename T> requires std::is_base_of<Base, T>::value void Method(T t) { }
方法过多时,可以将约束或约束集定义为概念。
概念定义:
template<typename T> concept BaseOfBase = std::is_base_of<Base, T>::value;
在模板约束中使用概念
template<typename T> requires BaseOfBase<T> void Method() { }
或者直接使用概念名对类型进行约束
template<BaseOfBase T> void Method() { }
无参构造函数概念
template<typename T> concept NewableConcept = requires{ new T; };
这里对概念使用了一个约束集,requires中如果有匹配失败的表达式,则该概念匹配失败。
使用无参构造函数和继承来约束
使用&&或者||进行表达式运算来判断匹配结果。
template<typename T> requires BaseOfBase<T> && NewableConcept<T> void Method() { }
文章评论