#include <type_traits>
#include <complex>
 
template<class> struct IsComplex_impl  {using type = std::false_type;};
template<class T> struct IsComplex_impl<std::complex<T>> {using type = std::true_type;};
 
template <typename T>
using IsComplex =  typename IsComplex_impl<T>::type;
 
/**
 * Evaluates to a true type if the given complex type is an Array of Structs, false otherwise
 * Defaults to false for Real values
 */
template<typename T, typename T_isComplex = IsComplex<T>>
struct IsAoS;
 
/**
 * Undefined for (unknown) complex types
 */
template< typename T >
struct IsAoS< T, std::false_type >: std::false_type{};
 
template<>
struct IsAoS< std::complex<double>>: std::true_type{};
 
 
int main() {
    static_assert(!IsAoS<int>::value , "");
    static_assert(IsAoS<std::complex<double>>::value , "");
    //static_assert(IsAoS<std::complex<float>>::value , "");
}
 
				I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Y29tcGxleD4KCnRlbXBsYXRlPGNsYXNzPiBzdHJ1Y3QgSXNDb21wbGV4X2ltcGwgIHt1c2luZyB0eXBlID0gc3RkOjpmYWxzZV90eXBlO307CnRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBJc0NvbXBsZXhfaW1wbDxzdGQ6OmNvbXBsZXg8VD4+IHt1c2luZyB0eXBlID0gc3RkOjp0cnVlX3R5cGU7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp1c2luZyBJc0NvbXBsZXggPSAgdHlwZW5hbWUgSXNDb21wbGV4X2ltcGw8VD46OnR5cGU7CgovKioKICogRXZhbHVhdGVzIHRvIGEgdHJ1ZSB0eXBlIGlmIHRoZSBnaXZlbiBjb21wbGV4IHR5cGUgaXMgYW4gQXJyYXkgb2YgU3RydWN0cywgZmFsc2Ugb3RoZXJ3aXNlCiAqIERlZmF1bHRzIHRvIGZhbHNlIGZvciBSZWFsIHZhbHVlcwogKi8KdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVF9pc0NvbXBsZXggPSBJc0NvbXBsZXg8VD4+CnN0cnVjdCBJc0FvUzsKCi8qKgogKiBVbmRlZmluZWQgZm9yICh1bmtub3duKSBjb21wbGV4IHR5cGVzCiAqLwp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CnN0cnVjdCBJc0FvUzwgVCwgc3RkOjpmYWxzZV90eXBlID46IHN0ZDo6ZmFsc2VfdHlwZXt9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgSXNBb1M8IHN0ZDo6Y29tcGxleDxkb3VibGU+Pjogc3RkOjp0cnVlX3R5cGV7fTsKCgppbnQgbWFpbigpIHsKICAgIHN0YXRpY19hc3NlcnQoIUlzQW9TPGludD46OnZhbHVlICwgIiIpOwogICAgc3RhdGljX2Fzc2VydChJc0FvUzxzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnZhbHVlICwgIiIpOwogICAgLy9zdGF0aWNfYXNzZXJ0KElzQW9TPHN0ZDo6Y29tcGxleDxmbG9hdD4+Ojp2YWx1ZSAsICIiKTsKfQo=