Group built in types to category
In is_charachter (which is misspelled; it should be is_character), you left out signed char (which is a distinct type from char). The same applies for all of the fixed width types (char8_t, char16_t, char32_t).

get_type returns some arbitrary magic number values.  You could create named constants to represent the type.  If you add a "unknown_type" value, then you wouldn't need to use std::optional.