struct false_type { static bool const value{false}; }; struct true_type { static bool const value{true}; }; // is const template struct is_const : false_type { }; template struct is_const : true_type { }; // is pointer template struct is_pointer : false_type { }; template struct is_pointer : true_type { }; template struct is_pointer : true_type { }; // is array template struct is_array : false_type { }; template struct is_array : true_type { }; // is const pointer template struct is_const_pointer { static bool const value { is_const::value && is_pointer::value }; }; int main() { static_assert(is_const::value, "is_const failed for 'int const'"); static_assert(is_const::value, "is_const failed for 'int* const'"); static_assert(!is_const::value, "is_const failed for 'int'"); static_assert(!is_const::value, "is_const failed for 'int const*'"); static_assert(is_pointer::value, "is_pointer failed for 'int*'"); static_assert(is_pointer::value, "is_pointer failed for 'int const*'"); static_assert(is_pointer::value, "is_pointer failed for 'int* const'"); static_assert(!is_pointer::value, "is_pointer failed for 'int'"); static_assert(is_array::value, "is_array failed for 'int[5]'"); static_assert(is_array::value, "is_array failed for 'int const[7]'"); static_assert(!is_array::value, "is_array failed for 'int'"); static_assert(is_const_pointer::value, "is_const_pointer failed for 'int* const'"); static_assert(!is_const_pointer::value, "is_const_pointer failed for 'int*'"); static_assert(!is_const_pointer::value, "is_const_pointer failed for 'int'"); static_assert(!is_const_pointer::value, "is_const_pointer failed for 'int const'"); }