C++20概念
00:00
C++20 Concepts约束模板详解。
1. 定义概念
template<typename T>
concept Integral = std::is_integral_v<T>;
template<typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> std::convertible_to<T>;
};
2. 使用概念约束模板
// 方式一:requires 子句
template<typename T> requires Integral<T>
T process(T value) { return value * 2; }
// 方式二:概念名替代 typename
template<Integral T>
T process(T value) { return value * 2; }
// 方式三:尾置 requires
auto process(auto value) requires Integral<decltype(value)> {
return value * 2;
}
3. 标准库概念
#include <concepts>
std::integral<T> // 整数类型
std::floating_point<T> // 浮点类型
std::same_as<T, U> // 相同类型
std::derived_from<T, B> // 派生关系
std::convertible_to<T, U> // 可转换
std::invocable<F, Args...> // 可调用
4. requires 表达式
template<typename T>
concept Container = requires(T t) {
typename T::value_type;
{ t.begin() } -> std::same_as<typename T::iterator>;
{ t.end() } -> std::same_as<typename T::iterator>;
{ t.size() } -> std::convertible_to<std::size_t>;
};