#ifndef SPROUT_MATH_FLOAT_PROMOTE_HPP #define SPROUT_MATH_FLOAT_PROMOTE_HPP #include #include namespace sprout { namespace math { namespace detail { template struct float_promote2 : public std::conditional< (std::is_same::value || std::is_same::value), std::common_type, typename std::conditional< (std::is_same::value && std::is_same::value), float, double > >::type { static_assert(std::is_arithmetic::value, "float_promote requires arithmetic type."); }; template struct float_promote_impl : public sprout::math::detail::float_promote_impl< typename sprout::math::detail::float_promote2::type, Tail... > {}; template struct float_promote_impl : public sprout::math::detail::float_promote2 {}; } // namespace detail // // float_promote // template struct float_promote : public sprout::math::detail::float_promote_impl< float, typename std::remove_cv::type... > {}; } // namespace math } // namespace sprout #endif // #ifndef SPROUT_MATH_FLOAT_PROMOTE_HPP