如果`constexpr`不匹配,则停止编译

时间:2019-06-05 18:41:05

标签: 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都不匹配,如何使代码无法编译?

2 个答案:

答案 0 :(得分:8)

解决方法是使用static_assert

但是我们不能简单地在static_assert(false, "whatever");分支中执行else,因为由于条件不取决于template参数,所以断言可能会提早触发(当编译器首次看到您的函数体时,即使实际上从未使用过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

答案 1 :(得分:0)

只是添加另一个答案,尽管想法是相同的。

你可以在你的 else 分支中使用它:

static_assert(!std::is_same_v<T,T>, "")

可读性稍差,但嘿它有效:)