AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
级别 57
CTAD:类模板参数的推导
C++ SELF
等级 57,
课时 0
解析
CTAD
(
Class Template Argument Deduction
)——C++17+ 的机制,允许不用手工写类模板参数:编译器从构造函数的参数中推导它们。通过
std::pair
、
std::array
、
std::vector
的示例讨论优点和陷阱(
{}
与
()
),然后在自己的代码中应用 CTAD(模板
Box<T>
和迷你上下文
TaskTracker
)并巩固常见错误。
典型陷阱 —
auto
x
{
1
}
vs
auto
x
=
{
1
}
C++ SELF
等级 57,
课时 1
我们来分析,为什么花括号
{}
与
auto
结合时会突然改变推导出来的类型:有时得到普通的
int
,有时却是
std::initializer_list<T>
。通过示例说明各种“症状”,比如突然出现
.size()
、与字符串字面量相关的陷阱,以及如何用正确的方式显式固定容器类型(
std::vector<std::string>
)。
为什么需要 concepts
C++ SELF
等级 57,
课时 2
我们来解析,为什么“通用”的
template
几乎总是隐藏着隐含要求(操作符
+
、
*
、方法
size()
、函数
begin()
/
end()
),为什么在实例化时会出现“长篇”错误,以及
concepts
和 constraints 如何把契约在签名中显式化并把诊断移到更接近调用处。通过
Transaction
、
sum2
和
safe_square
的示例展示效果并解析典型错误。
最简单的 concept 和 requires
C++ SELF
等级 57,
课时 3
我们来讲讲在 C++20/23 中如何停止“把模板喂任意类型”,并通过
concept
和
requires
预先描述契约:什么情况下
requires-expression
(
requires
(...) { ... }) 与
requires-clause
(…
requires
MyConcept
<
T
>) 不同,如何构造最小的
HasSize
和
Addable
,以及为什么写法
requires
(
T
x) 可能意外地要求可拷贝性(并“弄坏”
std::unique_ptr
)。
标准 concepts —
std::integral
,
std::floating_point
,
std::ranges::range
C++ SELF
等级 57,
课时 4
我们来解析为什么在 C++23 中将标准的
concepts
用作模板的契约:
constraints
如何在编译阶段“过滤”不合适的类型,整数(
std::integral
)和浮点(
std::floating_point
)的限制有何不同,以及如何通过
std::ranges::range
将算法泛化到任意序列。实践中我们构建一个简化版本的 DataBox 实用程序并讨论典型错误。
Please enable JavaScript to continue using this application.