concept
概述:
是C++20引入的新机制,旨在提供一种类型约束机制,使得模板的使用更加直观、可读且类型安全
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <iostream> #include <concepts> #include <string>
template <typename T> concept Incrementable = requires(T x) { { ++x } -> std::same_as<T&>; { x++ } -> std::same_as<T>; };
template <Incrementable T> void increment(T& x) { ++x; std::cout << x << std::endl; }
int main() { int a = 5; increment(a);
}
|
常见的内建concept:
- std::integral:表示整数类型(如int,long等)
- std::floating_point:表示浮点类型(如float、double等)
- std::same_as:检查两个类型是否相同
- std::convertible_to:检查一个类型是否可以转换为另一个类型
- std::invocable:检查类型是否可以被调用(如函数对象)
- std::signed_integral:表示带符号整数类型
- std::unsigned_integral:表示无符号整数类型
示例:
1 2 3 4 5 6 7 8 9
| template <std::integral T> T add(T a, T b) { return a + b; }
int main() { std::cout << add(5, 10) << std::endl; }
|
概念的组合:
concept还可以通过逻辑运算符组合,创建更复杂的类型约束:
- &&:要求类型同时满足多个条件
- ||:要求类型满足至少一个条件
- !:要求类型不满足这个条件
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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&>; { x++ } -> std::same_as<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); }
|