在 C++20 中,requires
是一个用于约束模板参数的关键字,它可以用于函数模板、类模板以及函数对象的模板参数中。requires
关键字后面跟着一个表达式,用于指定模板参数必须满足的条件。
requires
语句通常与 Concepts 一起使用,用于指定模板参数必须满足的概念(Concepts)。Concepts 是一种对模板参数进行约束和限制的机制,可以在编译时检查模板参数是否满足指定的条件。如果模板参数不满足指定的概念,编译器会在编译时产生错误。
requires
语句可以用来组合多个约束条件,并在其中使用逻辑运算符(如 &&
、||
、!
)来构建更复杂的约束条件。
#include <iostream>
#include <vector>
#include <concepts>
// 定义一个概念(Concepts),要求类型 T 必须支持加法操作
template <typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> std::same_as<T>; // a + b 的结果类型必须是 T 类型
};
// 定义一个概念,要求类型 T 必须支持乘法操作
template <typename T>
concept Multipliable = requires(T a, T b) {
{ a * b } -> std::same_as<T>; // a * b 的结果类型必须是 T 类型
};
// 使用 compound requires 语句约束函数模板的模板参数
template <typename T>
void addAndPrint(T a, T b) requires (Addable<T> && Multipliable<T>) {
T result = (a + b) * b;
std::cout << "Result of adding " << a << " and " << b << " and then multiplying by " << b << ": " << result << std::endl;
}
int main() {
addAndPrint(5, 3); // 正确:int 类型支持加法操作和乘法操作
// 下面这行代码会导致编译错误,因为 std::string 不满足 Multipliable 概念
// addAndPrint("Hello, ", "world!");
return 0;
}