concept
概述: 是C++20引入的新机制,旨在提供一种类型约束机制,使得模板的使用更加直观、可读且类型安全
示例:
#include <iostream>
#include <concepts>
#include <string>// 定义concept
template <typename T>
concept Incrementable = requires(T x) {{ ++x } -> std::same_as<T&>; // 确保类型 T 支持自增操作并返回 T&{ x++ } -> std::same_as<T>; // 确保类型 T 支持后置自增操作并返回 T
};// 使用定义的concept来约束模板参数
template <Incrementable T>
void increment(T& x) {++x;std::cout << x << std::endl;
}int main() {int a = 5;increment(a); // 有效,支持int自增操作// std::string b = "hello";// increment(b); // 编译错误,不支持自增操作
}
常见的内建concept:
- std::integral:表示整数类型(如int,long等)
- std::floating_point:表示浮点类型(如float、double等)
- std::same_as:检查两个类型是否相同
- std::convertible_to:检查一个类型是否可以转换为另一个类型
- std::invocable:检查类型是否可以被调用(如函数对象)
- std::signed_integral:表示带符号整数类型
- std::unsigned_integral:表示无符号整数类型
示例:
template <std::integral T>
T add(T a, T b) {return a + b;
}int main() {std::cout << add(5, 10) << std::endl; // 有效,int是integral类型// std::cout << add(5.5, 10.5) << std::endl; // 编译错误,double不是integral类型
}
概念的组合:
concept还可以通过逻辑运算符组合,创建更复杂的类型约束:
- &&:要求类型同时满足多个条件
- ||:要求类型满足至少一个条件
- !:要求类型不满足这个条件
示例:
template <typename T>
concept Addable = requires(T a, T b) {{ a + b } -> std::same_as<T>; // 必须支持加法运算
}template <typename T>
concept Incrementable = requires(T x) {{ ++x } -> std::same_as<T&>; // 确保类型 T 支持自增操作并返回 T&{ x++ } -> std::same_as<T>; // 确保类型 T 支持后置自增操作并返回 T
};template <typename T>
concept IncrementableAddable = Incrementable<T> && Addable<T>;template <IncrementableAddable T>
void incrementAndAdd(T& x, T y) {++x;x = x + ;y;std::cout << x << std::endl;
}int main() {int a = 5;incrementAndAdd(a, 10); // 有效
}