- 实现代码:
#include <concepts>
// 定义一个概念,表示类型T可比较
template<typename T>
concept Comparable = requires(T a, T b) {
{ a < b } -> std::same_as<bool>;
{ a > b } -> std::same_as<bool>;
{ a <= b } -> std::same_as<bool>;
{ a >= b } -> std::same_as<bool>;
};
// 定义一个概念,表示类型T可相加
template<typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> std::same_as<T>;
};
// 定义一个概念,表示类型T既满足可比较又满足可相加
template<typename T>
concept ComparableAndAddable = Comparable<T> && Addable<T>;
// 利用概念定义函数模板
template<ComparableAndAddable T>
T add_and_compare(T a, T b) {
if (a < b) {
return a + b;
} else {
return b + a;
}
}
- 原理解释:
- 概念定义:通过
concept
关键字定义了Comparable
、Addable
和ComparableAndAddable
三个概念。Comparable
概念通过requires
子句来检查类型T
是否重载了比较运算符,并且返回类型是否为bool
。Addable
概念通过requires
子句检查类型T
是否重载了加法运算符,并且返回类型是否为T
。ComparableAndAddable
概念则是Comparable
和Addable
概念的组合,要求类型T
同时满足这两个条件。
- 函数模板参数约束:在函数模板
add_and_compare
的定义中,使用ComparableAndAddable
概念来约束类型参数T
。这样,只有满足ComparableAndAddable
概念的类型才能作为函数模板的参数,从而精确控制了函数模板类型参数的兼容性。如果使用不满足该概念的类型调用函数模板,编译器会在编译期报错,指出类型不满足约束条件。