#include <iostream>
#include <array>
using namespace std;
enum class color
{
red,green,blue
};
auto f = []()
{
cout << "I'm lambda" << endl;
};
union A
{
int a;
float b;
string c;
};
class B
{
public:
int b;
void f() {}
};
int main()
{
cout << boolalpha << is_void<void>::value << endl;
cout << boolalpha << is_integral<int>::value << endl;
cout << boolalpha << is_floating_point<int>::value << endl;
cout << boolalpha << is_arithmetic<string>::value << endl;
cout << boolalpha << is_signed<string>::value << endl;
cout << boolalpha << is_unsigned<int>::value << endl;
cout << boolalpha << is_const<const int*>::value << endl;
cout << boolalpha << is_volatile<volatile int * volatile>::value << endl;
cout << boolalpha << is_array<array<int,5>>::value << endl;
cout << boolalpha << is_enum<color>::value << endl;
cout << boolalpha << is_union<A>::value << endl;
cout << boolalpha << is_class<A>::value << endl;
cout << boolalpha << is_function<decltype(f)()>::value << endl;
cout << boolalpha << is_reference<int&&>::value << endl;
cout << boolalpha << is_lvalue_reference<int&&>::value << endl;
cout << boolalpha << is_rvalue_reference<int&&>::value << endl;
cout << is_pointer<int*>::value << endl;
cout << is_member_pointer<decltype(&B::f)>::value << endl;
cout << is_member_object_pointer<decltype(&B::f)>::value << endl;
cout << is_member_function_pointer<decltype(&B::f)>::value << endl;
cout << is_fundamental<string>::value << endl;
cout << is_scalar<int>::value << endl;
cout << is_object<string>::value << endl;
system("pause");
return 0;
}