Concepts是C++20引入的模板约束机制,通过定义类型需满足的条件(如支持特定操作或属性),使模板仅能被符合条件的类型实例化,提升代码可读性与编译错误提示清晰度。

在C++20中,Concepts 提供了一种清晰、安全的方式来约束模板参数,避免在编译时报出冗长且难以理解的错误信息。通过使用 Concepts,你可以明确指定模板所接受的类型必须满足的条件,让代码更易读、更可靠。
Concepts 是一种对模板参数进行约束的机制。它允许你定义一组要求(如支持某些操作、具备特定属性),然后用这些要求来限制模板只能被符合条件的类型实例化。
比如,你想写一个只接受整数类型的函数模板,以前只能靠 SFINAE 或 static_assert 实现,现在可以直接用 concept 限制:
// 定义一个 concept:仅接受整数类型
template<typename T>
concept Integral = std::is_integral_v<T>;
// 使用 concept 约束模板参数
template<Integral T>
T add(T a, T b) {
return a + b;
}
立即学习“C++免费学习笔记(深入)”;
这样,如果有人尝试用 double 或自定义类调用 add,编译器会直接报错,并提示“不满足 Integral 约束”,而不是展开一堆模板推导失败的信息。
定义一个 concept 使用 concept 关键字,后面接名字和一个布尔表达式,通常基于 requires 表达式或类型特征(type traits)。
// 方法1:基于 type trait
template<typename T>
concept FloatingPoint = std::is_floating_point_v<T>;
// 方法2:使用 requires 表达式检查操作是否合法
template<typename T>
concept HasPlusOperator = requires(T a, T b) {
a + b;
};
// 方法3:更复杂的约束,检查是否存在某个成员函数
template<typename T>
concept Streamable = requires(T t, std::ostream& os) {
os << t;
};
这些 concept 可以直接用于模板声明中:
template<FloatingPoint T>
T square(T x) { return x * x; }
也可以用在函数参数位置(C++20 支持 abbreviated function template):
void print(Streamable auto& obj) {
std::cout << obj << '\n';
}
你可以用逻辑运算符组合多个 concept,构建更复杂的约束。
template<typename T>
concept Number = Integral<T> || FloatingPoint<T>;
template<Number T>
T max(T a, T b) {
return a > b ? a : b;
}
或者使用 requires 子句写更精细的条件:
template<typename T>
concept AddableAndDefaultConstructible = requires {
T{};
} && requires(T a, T b) {
a + b;
};
假设你要实现一个通用的容器遍历函数,只希望接受支持迭代器的类型,比如 vector、list,但不包括 int 或数组(退化成指针的情况除外)。
template<typename T>
concept Iterable = requires(T& t) {
begin(t);
end(t);
};
template<Iterable T>
void dump(const T& container) {
for (const auto& x : container)
std::cout << x << ' ';
std::cout << '\n';
}
这个 dump 函数就不会被误用于非容器类型,提升了接口安全性。
基本上就这些。Concepts 让泛型编程从“尽力而为”变成“有据可依”,减少错误,提升可维护性。不复杂但容易忽略的是 requires 表达式的写法——它只测试语法合法性,不执行语义检查,所以要结合实际需求设计 constraint 条件。
以上就是c++++怎么使用concepts约束模板参数_C++20 Concepts语法与泛型约束用法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号