C++20 概念(Concepts):模板参数的语义约束定义
什么是概念
概念是一套为模板参数定义语义约束的声明式工具。通过 concept 关键字,它将一组类型必须满足的编译期谓词封装为一个命名的语义契约。其本质是提升模板从'语法兼容'到'语义契约'的编译期接口系统。
它将类型需求从隐式的、被动的'鸭子类型'检测,转变为显式的、主动的、由编译器在实例化前验证的设计约束。核心理念是'约束即文档,文档可执行'。
示例
// 定义一个概念
template<typename T>
concept Integral = std::is_integral_v<T>;
// 使用概念
template<Integral T>
T add(T a, T b) {
return a + b;
}
add(5, 3); // 正确
add(5.5, 3.3); // 编译错误
概念用于指定模板参数必须满足的要求,它是类型和值的约束集合。
概念的定义语法
概念的基本用法是先定义,然后使用。
concept myconcept = 约束;
这里的'约束'可以是 requires 表达式,也可以是标准库提供的概念支持。
基本定义
template<typename T>
concept Drawable = requires(T t) {
t.draw();
};
template<typename T>
concept Integral = std::is_integral_v<T>;
组合概念
template<typename T>
concept Printable = requires(T t) {
{ std::cout << t } -> std::same_as<std::ostream&>;
};
template<typename T>
Serializable = (T t) {
t.();
T::deserialize;
};
< T>
DataObject = Printable<T> && Serializable<T>;

