1. C++20概念(Concepts)入门指南
C++20引入的Concepts特性彻底改变了我们编写模板代码的方式。作为一名长期奋战在C++一线的开发者,我深刻体会到Concepts带来的革命性变化——它让模板编程从"黑魔法"变成了可读、可维护的现代代码。本文将带你全面掌握这一重要特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 什么是Concepts
2.1 基本定义
Concept是C++20引入的一种编译期谓词,用于约束模板参数。简单说,它规定了模板参数必须满足的接口和行为要求。例如:
cpp复制template<typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> std::same_as<T>;
};
这个Addable concept要求类型T必须支持+操作,且结果类型与T相同。
2.2 与传统SFINAE对比
在C++17及之前,我们使用SFINAE(Substitution Failure Is Not An Error)技术来实现类似功能:
cpp复制template<typename T, typename = std::void_t<>>
struct is_addable : std::false_type {};
template<typename T>
struct is_addable<T, std::void_t<decltype(std::declval<T>() + std::declval<T>())>>
: std::true_type {};
template<typename T, typename = std::enable_if_t<is_addable<T>::value>>
void func(T a, T b);
Concepts相比SFINAE有三大优势:
- 可读性强:语义明确,不像SFINAE那样晦涩
- 错误信息友好:编译器能直接指出哪个concept不满足
- 组合方便:可以用逻辑运算符组合多个concepts
3. 标准库中的常用Concepts
3.1 基础Concepts
C++20标准库定义了大量实用concepts,主要分布在
cpp复制// 类型关系
std::same_as<T, U> // T和U是相同类型
std::derived_from<T, U> // T派生自U
std::convertible_to<T, U> // T可转换为U
// 比较操作
std::equality_comparable_with<T, U> // T和U可进行==比较
std::totally_ordered_with<T, U> // 支持<, >, <=, >=
/
