#include <type_traits>
#include <complex>
template<class> struct IsComplex_impl : std::false_type {};
template<class T> struct IsComplex_impl<std::complex<T>> : std::true_type {};
template <typename T>
constexpr bool IsComplex() {return IsComplex_impl<T>::value;}
/**
* 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, bool T_isComplex = IsComplex<T>()>
struct IsAoS;
/**
* Undefined for (unknown) complex types
*/
template< typename T >
struct IsAoS< T, false>: 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 , "");
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Y29tcGxleD4KCnRlbXBsYXRlPGNsYXNzPiBzdHJ1Y3QgSXNDb21wbGV4X2ltcGwgIDogc3RkOjpmYWxzZV90eXBlIHt9Owp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgSXNDb21wbGV4X2ltcGw8c3RkOjpjb21wbGV4PFQ+PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNvbnN0ZXhwciBib29sIElzQ29tcGxleCgpIHtyZXR1cm4gSXNDb21wbGV4X2ltcGw8VD46OnZhbHVlO30KCgovKioKICogRXZhbHVhdGVzIHRvIGEgdHJ1ZSB0eXBlIGlmIHRoZSBnaXZlbiBjb21wbGV4IHR5cGUgaXMgYW4gQXJyYXkgb2YgU3RydWN0cywgZmFsc2Ugb3RoZXJ3aXNlCiAqIERlZmF1bHRzIHRvIGZhbHNlIGZvciBSZWFsIHZhbHVlcwogKi8KdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBUX2lzQ29tcGxleCA9IElzQ29tcGxleDxUPigpPgpzdHJ1Y3QgSXNBb1M7CgovKioKICogVW5kZWZpbmVkIGZvciAodW5rbm93bikgY29tcGxleCB0eXBlcwogKi8KdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpzdHJ1Y3QgSXNBb1M8IFQsIGZhbHNlPjogc3RkOjpmYWxzZV90eXBle307Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBJc0FvUzwgc3RkOjpjb21wbGV4PGRvdWJsZT4+OiBzdGQ6OnRydWVfdHlwZXt9OwoKCmludCBtYWluKCkgewogICAgc3RhdGljX2Fzc2VydCghSXNBb1M8aW50Pjo6dmFsdWUgLCAiIik7CiAgICBzdGF0aWNfYXNzZXJ0KElzQW9TPHN0ZDo6Y29tcGxleDxkb3VibGU+Pjo6dmFsdWUgLCAiIik7CiAgICAvL3N0YXRpY19hc3NlcnQoSXNBb1M8c3RkOjpjb21wbGV4PGZsb2F0Pj46OnZhbHVlICwgIiIpOwp9Cg==