c++ - 如果 `if constexpr` 不匹配则停止编译

标签 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 都不匹配,我怎样才能使代码编译失败?

最佳答案

解决方案是使用static_assert

但我们不能简单地在 else 分支中执行 static_assert(false, "whatever");,因为条件不依赖于模板参数,断言可能会提早触发(当编译器第一次看到您的函数体时,即使 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 移动到 static_assert 并删除 if

关于c++ - 如果 `if constexpr` 不匹配则停止编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466282/

相关文章:

c++ - Visual C++ 运行时对象销毁顺序

c++ - 您自己的类型的结构化绑定(bind)不是结构或元组(通过公共(public)成员函数)

c++ - C++17 中的 "If constexpr"在非模板函数中不起作用

c++ - 我需要把 constexpr 放在 else-if 之后吗?

c++ - 使用 lambda 编译 constexpr 时出现 MSVS2017 错误 "expression did not evaluate to a constant"

c++ - 澄清列表和删除元素

c++ - fork 子程序中要求与启动器程序进行管道通信

c++ - 类 : where to specify it? 函数的默认模板参数

c# - 浮点 Div/Mul > 比 Add/Sub 慢 30 倍?

C++ 17 : How to call a different constructor using if constexpr?