#include <iostream>
#include <complex>
#include <type_traits>

namespace std {

template< class T >
struct is_floating_point<std::complex<T>> : std::integral_constant<
                               bool,
                               std::is_same<float, typename std::remove_cv<T>::type>::value  ||
                               std::is_same<double, typename std::remove_cv<T>::type>::value  ||
                               std::is_same<long double, typename std::remove_cv<T>::type>::value
                           > {};

}

int main() {
  std::cout << std::boolalpha << std::is_floating_point<double>::value << std::endl;
  std::cout << std::boolalpha << std::is_floating_point<std::complex<double>>::value << std::endl;
  std::cout << std::boolalpha << std::is_floating_point<std::complex<long double>>::value << std::endl;
}