C++中的concept

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>

// 定义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:表示无符号整数类型

示例:

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; // 有效,int是integral类型
// std::cout << add(5.5, 10.5) << std::endl; // 编译错误,double不是integral类型
}

概念的组合:

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&>; // 确保类型 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); // 有效
}

C++中的concept
http://example.com/2024/12/28/C-中的concept/
作者
凌云行者
发布于
2024年12月28日
许可协议