#include <type_traits>
#include <complex>
    template<class T>
    struct is_complex_or_floating_point : std::is_floating_point<T> { };
    
    template<class T>
    struct is_complex_or_floating_point<std::complex<T>> : std::is_floating_point<T> { };
    
int main()
{
    static_assert(!is_complex_or_floating_point<int>::value, "");
    static_assert(is_complex_or_floating_point<float>::value, "");
    static_assert(is_complex_or_floating_point<double>::value, "");
    static_assert(is_complex_or_floating_point<std::complex<float>>::value, "");
    static_assert(is_complex_or_floating_point<std::complex<double>>::value, "");
}