条件逻辑
std::conditional 与 if constexpr
条件逻辑 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
选择类型与分支
类型特征逻辑允许代码在编译时选择类型和代码路径。关键工具是 std::conditional 和 if constexpr。
std::conditional
当 cond 为 true 时,std::conditional_t<cond, A, B> 的结果为 A;否则为 B。
#include <iostream>
#include <type_traits>
int main() {
using T = std::conditional_t<true, int, double>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}选择存储类型
一种常见用法是:对于较大的值选择宽类型,否则选择窄类型。
#include <iostream>
#include <type_traits>
template <bool Big>
struct Storage {
using type = std::conditional_t<Big, long long, short>;
};
int main() {
Storage<true>::type a = 10;
std::cout << sizeof(a) << "\n";
return 0;
}if constexpr 基础
if constexpr(C++17)会在编译时丢弃未被选中的分支。对于给定类型,只有被选中的分支必须能够通过编译。
#include <iostream>
#include <type_traits>
template <typename T>
void describe(T v) {
if constexpr (std::is_integral_v<T>)
std::cout << "integer: " << v << "\n";
else
std::cout << "other: " << v << "\n";
}
int main() {
describe(5);
describe(2.5);
return 0;
}为什么 if constexpr 优于运行时 if
使用普通的 if 时,对于每个 T,两个分支都必须能够通过编译。使用 if constexpr 时,被拒绝的分支不会被实例化,因此其中可以包含特定于类型的代码,而这些代码在其他情况下可能无法通过编译。
特定于类型的操作
使用普通的 if 无法做到这一点,因为对 int 使用 .length() 无法通过编译。
#include <iostream>
#include <string>
#include <type_traits>
template <typename T>
auto size_of(const T& v) {
if constexpr (std::is_same_v<T, std::string>)
return v.length();
else
return sizeof(v);
}
int main() {
std::cout << size_of(std::string("hi")) << "\n";
std::cout << size_of(42) << "\n";
return 0;
}用于重载的 enable_if
在 if constexpr 出现之前,std::enable_if 通过 SFINAE 选择重载。当条件为 false 时,它会将函数从重载决议中移除。
#include <iostream>
#include <type_traits>
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }
int main() {
only_int(7);
return 0;
}组合条件
您可以像组合普通布尔值一样,在编译时条件中使用 &&、|| 和 ! 组合类型特征。
#include <iostream>
#include <type_traits>
template <typename T>
void check() {
if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
std::cout << "non-bool integer\n";
else
std::cout << "something else\n";
}
int main() {
check<int>();
check<bool>();
return 0;
}递归式编译时选择
if constexpr 支持编译时递归,这对于逐个处理元组或参数包中的元素很有用。
conjunction 和 disjunction
C++17 还提供了 std::conjunction 和 std::disjunction,用于对类型特征列表执行具有短路特性的逻辑 AND/OR 运算。
选择合适的工具
使用 conditional 选择类型,使用 if constexpr 选择代码,使用 enable_if/概念控制重载决议。现代代码更倾向于使用 if constexpr 和概念,以获得更清晰的表达。
快速检查
回顾 if constexpr 的主要优势。
总结
您学习了编译时条件逻辑。
conditional_t<c,A,B>选择一个类型if constexpr选择代码,并丢弃另一个分支enable_if通过 SFINAE 控制重载决议- 使用逻辑运算符组合类型特征
常见问题解答
「条件逻辑」课时是免费的吗?
是的 — 「条件逻辑」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「条件逻辑」这节课中我会学到什么?
std::conditional 与 if constexpr 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「条件逻辑」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。