#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, "");
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Y29tcGxleD4KICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICBzdHJ1Y3QgaXNfY29tcGxleF9vcl9mbG9hdGluZ19wb2ludCA6IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD4geyB9OwogICAgCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgc3RydWN0IGlzX2NvbXBsZXhfb3JfZmxvYXRpbmdfcG9pbnQ8c3RkOjpjb21wbGV4PFQ+PiA6IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD4geyB9OwogICAgCmludCBtYWluKCkKewogICAgc3RhdGljX2Fzc2VydCghaXNfY29tcGxleF9vcl9mbG9hdGluZ19wb2ludDxpbnQ+Ojp2YWx1ZSwgIiIpOwogICAgc3RhdGljX2Fzc2VydChpc19jb21wbGV4X29yX2Zsb2F0aW5nX3BvaW50PGZsb2F0Pjo6dmFsdWUsICIiKTsKICAgIHN0YXRpY19hc3NlcnQoaXNfY29tcGxleF9vcl9mbG9hdGluZ19wb2ludDxkb3VibGU+Ojp2YWx1ZSwgIiIpOwogICAgc3RhdGljX2Fzc2VydChpc19jb21wbGV4X29yX2Zsb2F0aW5nX3BvaW50PHN0ZDo6Y29tcGxleDxmbG9hdD4+Ojp2YWx1ZSwgIiIpOwogICAgc3RhdGljX2Fzc2VydChpc19jb21wbGV4X29yX2Zsb2F0aW5nX3BvaW50PHN0ZDo6Y29tcGxleDxkb3VibGU+Pjo6dmFsdWUsICIiKTsKfQ==