#include <iostream>
#include <vector>
using namespace std;
template <typename T, typename Enable=void>
struct foo {
void operator()() const { cout << "unspecialized" << endl; }
};
template <typename T>
struct foo<T, enable_if_t<
is_integral<T>::value
>>{
void operator()() const { cout << "is_integral" << endl; }
};
template <typename T>
struct foo<T, enable_if_t<
sizeof(T) == 4
and not is_integral<T>::value
>>{
void operator()() const { cout << "size 4" << endl; }
};
template <typename T>
struct foo<T, enable_if_t<
is_fundamental<T>::value
and not (sizeof(T) == 4)
and not is_integral<T>::value
>>{
void operator()() const { cout << "fundamental" << endl; }
};
int main() {
foo<int>()();
foo<float>()();
foo<double>()();
foo<vector<int>>()();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGU9dm9pZD4Kc3RydWN0IGZvbyB7CiAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QgeyBjb3V0IDw8ICJ1bnNwZWNpYWxpemVkIiA8PCBlbmRsOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGZvbzxULCBlbmFibGVfaWZfdDwKICBpc19pbnRlZ3JhbDxUPjo6dmFsdWUKPj57CiAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QgeyBjb3V0IDw8ICJpc19pbnRlZ3JhbCIgPDwgZW5kbDsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBmb288VCwgZW5hYmxlX2lmX3Q8CiAgc2l6ZW9mKFQpID09IDQKICAgIGFuZCBub3QgaXNfaW50ZWdyYWw8VD46OnZhbHVlCj4+ewogIHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgY291dCA8PCAic2l6ZSA0IiA8PCBlbmRsOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGZvbzxULCBlbmFibGVfaWZfdDwKICBpc19mdW5kYW1lbnRhbDxUPjo6dmFsdWUKICAgIGFuZCBub3QgKHNpemVvZihUKSA9PSA0KQogICAgYW5kIG5vdCBpc19pbnRlZ3JhbDxUPjo6dmFsdWUKPj57CiAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QgeyBjb3V0IDw8ICJmdW5kYW1lbnRhbCIgPDwgZW5kbDsgfQp9OwoKaW50IG1haW4oKSB7CiAgZm9vPGludD4oKSgpOwogIGZvbzxmbG9hdD4oKSgpOwogIGZvbzxkb3VibGU+KCkoKTsKICBmb288dmVjdG9yPGludD4+KCkoKTsKfQo=