你能用 constexpr 替换 enable_if 来禁用它的功能吗?

can you replace enable_if to disable a function it if constexpr?

所以我知道你可以使用 enable_if 来禁用函数模板(例如,如果类型不是整数) - 但你可以用 constexpr 做同样的事情吗?

即有没有等价物:

template<class T, typename = std::enable_if_t<std::is_integral_v<T>> >
T test2()
{
    return {};
}

with constexpr - 类似于:

template <typename T>
T test()
{
    // we expect various integral and floating point types here
    if constexpr (std::is_integral_v<T>)
    {
        T output{};
        return output;
    }
    else
    {
       // trigger compiler error
       return{};
    }
}

所以我想要:

test(1); // compile ok
test(std::string("hello")); // compile fail

您可以将 static_assert 与在 constexpr if 中始终为 false 的依赖于类型的表达式一起使用。

template<class> inline constexpr bool dependent_false_v = false;
template <> inline constexpr bool dependent_false_v<decltype([](){})> = true; // requires C++20
template <typename T>
T test(T)
{
    // we expect various integral and floating point types here
    if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>)
    {
        T output{};
        return output;
    }
    else
    {
       // trigger compiler error
       static_assert(dependent_false_v<T>);
    }
}

就这么简单:

template <typename T>
T test()
{
  static_assert(std::is_integral_v<T>);
  T output{};
  return output;
}