C++20中可通过concept约束模板参数的成员要求:一、用requires表达式定义原子约束;二、组合标准概念与自定义约束;三、将concept用于函数模板参数;四、用嵌套requires处理依赖型成员;五、用多参数concept校验类型间关系。

如果您希望在 C++20 中限制模板参数仅接受那些拥有特定成员(如 operator+、begin()、size() 或自定义成员函数/嵌套类型)的类类型,则需借助概念(concept)机制定义编译时约束。以下是实现该目标的多种方法:
一、使用 requires 表达式定义原子约束
此方法直接在 concept 定义中声明对类型 T 的具体成员访问要求,适用于精确控制单个或多个成员存在性及可调用性。requires 表达式在编译期展开并验证语法合法性,不执行运行时求值。
1、定义一个要求类型 T 具有 const 成员函数 size() 且返回整型的 concept:
template
立即学习“C++免费学习笔记(深入)”;
2、定义一个要求类型 T 支持 operator== 且返回布尔类型的 concept:
template
3、定义一个要求类型 T 具有嵌套类型 value_type 和成员函数 begin()、end() 的 concept:
template
二、组合已有标准概念与自定义 requires 约束
此方法复用 STL 提供的标准概念(如 std::derived_from、std::destructible),再叠加自定义成员访问逻辑,构建语义更丰富的复合约束,避免重复定义基础属性。
1、要求类型 T 必须派生自某个基类 Base,同时具备 serialize() 成员函数:
template
2、要求类型 T 是可移动的(movable),且具有静态成员 max_capacity:
template
3、要求类型 T 满足 std::regular(即默认构造、可复制、可比较等),并额外提供 to_json() 方法:
template
三、通过 concept 声明类型约束并应用于函数模板
此方法将已定义的概念作为模板参数约束直接写入函数模板签名,使接口意图清晰可见,并在不满足时触发精准编译错误,而非泛化的 SFINAE 或 static_assert 失败信息。
1、声明一个仅接受具有 data() 和 length() 成员的类型的函数模板:
template
2、为容器类编写算法,强制要求其支持随机访问迭代器和 at() 下标检查:
template 3、定义一个仅接受含 static constexpr bool is_valid 的类模板特化约束: template 当所需成员本身依赖模板参数(例如依赖于 T::iterator 的 value_type),需在 requires 表达式中显式引入中间类型别名或使用 decltype 推导,确保编译器能正确解析嵌套路径。 1、要求类型 T 的迭代器必须支持 operator* 并返回可转换为 int 的类型: template 2、要求类型 T 具有嵌套类 Config,且 Config 中存在 version 静态常量: template 3、要求类型 T 提供 get_handle() 成员函数,其返回类型具有 close() 方法: template 此方法适用于需同时约束多个模板参数之间关系的情形,例如要求两个类型具备兼容的 value_type、或其中一个类型能隐式转换为另一个,且两者均满足成员存在性要求。 1、定义 concept 要求 T 和 U 均具有 key_type 和 mapped_type,且 key_type 可相互比较: template 2、要求第一个参数是容器,第二个参数是其 value_type 的可构造对象,且容器具备 push_back: template 3、定义 concept 要求 T 是类类型,U 是其嵌套作用域中的枚举,并且 T 提供 to_enum(U) 成员函数: template四、利用嵌套 requires 子句处理依赖型成员访问
五、使用 template-parameter-list 约束结合 concept 实现多参数协同校验


















