
Hi Matt, the ccmath functions must/could only work with std types. Is this assumption correct? If true: Wouldn't it make sense to do such a check for CT? This way errors can be detected early and it generally simplifies error handling. namespace boost::math::ccmath { namespace detail { template <typename type> inline constexpr auto foo_impl(const Type x) noexcept { return x; } } // detail template <typename Type> constexpr auto foo(const Type x) noexcept { BOOST_IF_CONSTEXPR (std::is_arithmetic_v<Type>) { if (BOOST_MATH_IS_CONSTANT_EVALUATED(x)) { BOOST_IF_CONSTEXPR (std::is_integral_v<Type>) { return detail::foo_impl(double(x)); } else { return detail::foo_impl(x); } } else { using ::std::foo; return foo(x); } } else { static_assert(boost::dependent_false_v<Type>, "foo is not supported with this type or platform"); return 0; } } } // boost::math::ccmath 1) In particular, this approach is useful for functions that require BOOST_MATH_BIT_CAST in their implementation. To be honest, I don't like your implementations of signbit/copysign (buggy) - I'll write you something more on that. 2) The idiom "always false" (dependent_false) guarantees that static_assert is only used for Type!=is_arithmetic. cu Gero
participants (1)
-
Gero Peterhoff