🥧利用 C++ Concepts 做编译期检查
00 分钟
2024-8-19
2024-9-13
type
status
date
slug
summary
tags
category
icon
password

背景

Concepts 是 C++ 20 推出的新特性,旨在以一种更简单的方法做编译期检查。
 
有一些时候我们会想对模板参数做一些限制,在 C++ 20 以前,我们通常会用 static_assert 来快速抛出一个可读的编译错误,比如:
 
当然我们也可以用 std::enable_if_t 来达到同样的效果:
而 C++ 20 之后,我们可以以一种更简洁的手段去做编译期检查。

Requires

requires 是 C++ 20 新增的关键词,在模板参数后面加上 “requires + 编译期常量表达式” 的组合,可以对模板参数加以限制,最简单的用法:
 
另外一种写法是放在函数定义头后,效果等同于上面的写法:
 
当然,不光模板函数可以用,模板类和模板变量也是可以的:
 
更多时候 requires 还是与 Concept 一同使用,我们下面介绍 Concept。

Concept

Concept 是 C++ 20 新增的编译期约束系统,我们可以使用 concept 关键字来定义一个编译期约束:
 
Concept 本身可以直接当成编译期常量使用,例如我们可以喂给 static_assert
 
当然更多时候还是配合 requires 一起使用:
 
Concept 也是可以再被组合的,例如:
 
除了跟 requires 配合使用,Concept 可以直接在模板参数定义时用作 模板的类型,写法简化很多,这种用法会更多一些:
 
当然,Concept 还能做更复杂的编译期校验,例如限定作为模板参数的类型必须包含某个成员或者变量:
 
我们甚至能限制类型的某个成员必须为特定类型:
 
Concept 也能接受多个模板参数,这种情况下编译器会隐式地把待检查的模板参数作为第一个模板参数转给 Concept,例如:
 
前面用到的 std::convertible_to 其实就是一个标准库内置的两参数 Concept。值得一提的是,标准库头文件 <concepts> 里提供了一大堆内置的 Concept 定义,例如:std::integralstd::move_constructible 等等,这一类的编译期校验就不要自己再重复造轮子了,直接用就完事了。
 
利用好 Concept,可以很方便的去做编译期检查,告别一大堆模板报错不知所措的尴尬场景,大家赶紧用起来吧 ✨

参考资料

 
上一篇
地表最强 Contact Shadow
下一篇
一文理解 FP16 Shader

评论
Loading...