查询类型
在编译期检查类型
查询类型 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是类型特征
<type_traits> 头文件允许您在编译时询问类型相关的问题。每个特征都是一个模板,会公开常量 ::value 或成员类型。
is_integral
对于 int 和 char 等整数类型,std::is_integral<T>::value 为 true;对于其他类型则为 false。
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_integral<int>::value << "\n";
std::cout << std::is_integral<double>::value << "\n";
return 0;
}_v 简写
C++17 添加了 _v 变量模板,因此您可以写成 std::is_integral_v<T>,而不是 ::value。
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_integral_v<long> << "\n";
std::cout << std::is_floating_point_v<float> << "\n";
return 0;
}类别特征
许多特征用于对类型进行分类。
is_pointeris_referenceis_arrayis_classis_enum
#include <iostream>
#include <type_traits>
struct S {};
int main() {
std::cout << std::is_pointer_v<int*> << "\n";
std::cout << std::is_class_v<S> << "\n";
std::cout << std::is_reference_v<int&> << "\n";
return 0;
}关系特征
有些特征用于比较两种类型。
is_same<A,B>is_base_of<Base,Derived>is_convertible<From,To>
#include <iostream>
#include <type_traits>
struct Base {};
struct Derived : Base {};
int main() {
std::cout << std::is_same_v<int, int> << "\n";
std::cout << std::is_base_of_v<Base, Derived> << "\n";
return 0;
}属性特征
属性特征用于报告限定符和能力。
is_constis_signedis_trivially_copyableis_default_constructible
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_const_v<const int> << "\n";
std::cout << std::is_signed_v<unsigned> << "\n";
return 0;
}在 static_assert 中使用特征
特征与 static_assert 结合得非常好,可以在编译时强制执行要求。
#include <type_traits>
#include <iostream>
template <typename T>
T add(T a, T b) {
static_assert(std::is_arithmetic_v<T>, "T must be a number");
return a + b;
}
int main() {
std::cout << add(2, 3) << "\n";
return 0;
}特征的工作方式
特征本质上只是一个结构体模板。通用模板继承 false_type;针对匹配类型的特化版本继承 true_type。编译器会选择最佳匹配。
integral_constant
所有布尔特征都派生自 std::integral_constant。true_type 和 false_type 只是它的别名,分别将 value 设置为 true 或 false。
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::true_type::value << "\n";
std::cout << std::false_type::value << "\n";
return 0;
}在模板内部进行查询
特征允许模板根据接收到的类型种类进行分支,从而让泛型代码针对整数、浮点数、指针或类类型采取不同的处理方式。
仅限编译时
特征查询不会产生运行时开销;它们会在编译期间求值,结果会直接固化到生成的代码中。
快速检查
请回忆 C++17 中的便捷语法。
回顾
您学会了查询类型。
<type_traits>可以在编译时回答类型相关的问题::value或_v简写会返回布尔值- 类别特征、关系特征和属性特征
- 与
static_assert搭配使用可以强制执行约束
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「查询类型」课时是免费的吗?
是的 — 「查询类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「查询类型」这节课中我会学到什么?
在编译期检查类型 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「查询类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。