3

我有一个模板函数,它检查模板参数的类型,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 都不匹配,如何使代码无法编译?

4

2 回答 2

13

解决方案是使用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链条),则不需要这些。

只需将条件从ifa 移至 astatic_assert并删除if.

于 2019-06-05T18:47:52.527 回答
1

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

您可以在 else 分支中使用它:

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

有点不可读,但嘿它有效:)

于 2021-05-09T22:22:43.837 回答