c++ - 如果 `if constexpr` 不匹配,则停止编译
问题描述
我有一个模板函数,它检查模板参数的类型,if constexpr
例如
template <typename T>
bool something(T arg) {
if constexpr (std::is_integral_v<T>) {
return true;
} else {
// What can I write here so that something<double>(0.0) does not compile?
}
return false;
}
if constexpr
如果我的 s 都不匹配,如何使代码无法编译?
解决方案
解决方案是使用static_assert
.
但是我们不能简单地static_assert(false, "whatever");
在else
分支中做,因为由于条件不依赖于模板参数,断言可能会提前触发(当编译器第一次看到你的函数体时,即使else
分支实际上从未被采用)。
的条件static_assert
必须以某种方式依赖T
, 以延迟断言检查,直到您的模板被实例化。
这是我一直在使用的:
template <auto A, typename...> auto value = A;
if constexpr (foo)
{
...
}
else if constexpr (bar)
{
...
}
else
{
static_assert(value<false, T>, "Invalid template parameter.");
}
请注意,如果您只有一个 if constexpr
(而不是if
else if
链条),则不需要这些。
只需将条件从if
a 移至 astatic_assert
并删除if
.
推荐阅读
- java - 如何更新 GraalVM?
- laravel - 在 laravel 项目中使用 vue.js vue-notus 模板
- matplotlib - 如何让 jupyterlab 显示 %matplotlib ipympl - 在笔记本的第一次运行中显示?
- javascript - 分别将 FormData 发送到不同的 API
- java - 如何在不锁定 UI 的情况下从 MySQLite 进行 SELECT?
- helix - 如何在 helix 3d c# wpf 中添加阴影
- ignite - 查询远程过滤器内的不同缓存以进行连续查询
- php - 使用 Laravel + Ratchet PHP 启用 TLS 时,JS 客户端出现连接错误 1006
- regex - Golang 匹配字符获取子字符串
- postgresql - 根据与 localtimestamp 和其他列相关的 Date Activated/Date Deactivated 列计算记录状态