当前位置: 首页 > news >正文

c++20 Concepts的简写形式与requires 从句形式

c++20 Concepts的简写形式与requires 从句形式

      • 原始写法(简写形式)
      • 等效写法(requires 从句形式)
      • 关键区别说明:
      • 组合多个约束的示例:
      • 两种形式的编译结果:
      • 更复杂的约束示例:
      • 标准库风格的约束:

在 C++20 Concepts 中,使用简写形式的 template<ConceptName T> 与使用完整形式的 template<typename T> requires ConceptName<T> 是等价的。以下是两种写法的具体转换:

原始写法(简写形式)

template<typename T>
concept Arithmetic = std::is_arithmetic_v<T>;

template<Arithmetic T>  // 简写形式
T add(T a, T b) { return a + b; }

等效写法(requires 从句形式)

template<typename T>
concept Arithmetic = std::is_arithmetic_v<T>;

template<typename T>    // 完整形式
requires Arithmetic<T>  // requires 从句
T add(T a, T b) { return a + b; }

关键区别说明:

特征简写形式requires 从句形式
语法结构template<ConceptName T>template<typename T> requires ...
可组合性只能指定单个 Concept可通过逻辑运算符组合多个约束
约束表达式位置模板参数声明中模板参数列表后的 requires 从句中
适用场景简单约束复杂约束(需要组合多个条件时)

组合多个约束的示例:

template<typename T>
concept Signed = std::is_signed_v<T>;

template<typename T>
requires Arithmetic<T> && Signed<T>  // 组合两个约束
T negative(T value) {
    return -value;
}

negative(5);     // OK
negative(3.14);  // OK
negative("123"); // 错误:不满足 Arithmetic 约束
negative(2u);    // 错误:unsigned 不满足 Signed 约束

两种形式的编译结果:

  1. 错误信息对比

    add("hello", "world");  // 错误信息中会明确显示:
    // 简写形式:"constraints not satisfied for 'T'"
    // requires 从句形式:"constraint 'Arithmetic<T>' was not satisfied"
    
  2. 元编程特性保留

    template<Arithmetic T>      // 两种形式均可配合
    struct Calculator {         // SFINAE、if constexpr 等特性
        static_assert(Signed<T>);
    };
    

更复杂的约束示例:

template<typename T>
concept Printable = requires(std::ostream& os, T val) {
    { os << val } -> std::same_as<std::ostream&>;
};

template<typename T>
requires Arithmetic<T> && Printable<T>
void print_sum(T a, T b) {
    std::cout << (a + b) << "\n";
}

print_sum(3, 5);    // OK:int 是算术类型且可打印
print_sum(2.71, 3); // OK:double 符合条件
print_sum(true, false); // 错误:bool 是算术类型但不符合 Printable(需要重载<<)

标准库风格的约束:

template<typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::convertible_to<T>;
};

template<typename T>
requires Addable<T>  // 替代 C++17 的 std::void_t 技巧
T sum(T a, T b) { return a + b; }

建议:当约束条件简单时使用简写形式,需要组合多个约束或需要更清晰的错误信息时使用 requires 从句形式。

相关文章:

  • 二叉树_3_模拟实现二叉树
  • PySide(PyQT),QGraphicsItem的pos()和scenePos()区别
  • 【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
  • Kotlin D3
  • 推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
  • H3C交换机的VRRP配置
  • Ansible运行原理揭秘:如何用YAML脚本掌控数服务器?
  • 第二篇:CTF常见题型解析:密码学、逆向工程、漏洞利用、Web安全
  • vue3 element-plus form校验不生效
  • python-leetcode-递增的三元子序列
  • 详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本
  • 数据库系统概论(三)数据库系统的三级模式结构
  • 软考 中级软件设计师 考点知识点笔记总结 day03
  • Blender UV纹理贴图,导出FBX到Unity
  • SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】
  • centos安装python3.9.9总结和笔记
  • coze ai assistant Task 1
  • Java中的常用关键字
  • 基于SpringBoot的校园二手交易平台(计算机毕设-JAVA)
  • Oracle/MySQL/PostgreSQL 到信创数据库数据同步简介
  • 汕头违建豪宅“英之园”将强拆,当地:将根据公告期内具体情况采取下一步措施
  • 外企聊营商|特雷通集团:税务服务“及时雨”
  • “典孝急乐批麻蚌赢”:互联网“八字真言”与当代赛博赢学
  • 微软宣布将裁员3%
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 北美票房|昔日偶像风光不再,乔什·哈内特新片开画不佳