引入#
Concept 作为 C++ 20
引入的一个新特性,是一个语法糖,同时也提供了相当一部分模版类型限定的预设,以及提供了用户友好的模版匹配失败报错。
直接使用 概念#
譬如,通过以下代码,你可以限定你的模版类 / 模版函数的模版类型 Ty 必须支持比较:
template < typename Ty >
requires std::totally_ordered < Ty > // 要求 Ty 完全可比较
void print_less ( Ty a, Ty b )
{
std::cout << (a < b ? a : b) << "is the less.";
}
当然,要使用模版库,你需要引入头文件 <concepts> ,从而使用基础库概念们的定义。
定义 概念#
当遇到需要复用的一系列概念的集合的限定,你可以像这样指定:
template < typename Ty >
concept comparable_integral = integral< Ty > && std::totally_ordered < Ty >;
template < comparable_integral T >
void check_if_int_comparable( T a, T b )
{
std::cout << (a < b ? a : b) ;
}
int main()
{
check_if_int_comparable( 3, 4 );
// check_if_int_comparable( 0.5, 0.6 ); // parse failed
}
参考#
更多关于 约束传入模版类型 详见C++模板如何要求传入的类型符合要求 - mq白
更多关于 Concept 请详见 概念库 (C++20) - cppreference.com 与 C++20高级编程(英文版) - Professional C++ ( Marc Gregoire ) 中的模版章节。