你能用 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;
}
所以我知道你可以使用 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;
}