Удаление квалификаторов cv, а также возврат не ссылочного типа будет поддерживаться с C ++ 20 и далее std :: remove_cvref
Однако на текущий моментстандартно, вы можете использовать функции модификации типов в сочетании
template<class T1, class T2>
void print_is_same() {
std::cout << std::is_same<T1, T2>() << '\n';
}
int main() {
std::cout << std::boolalpha;
print_is_same<char, int>(); //false
print_is_same<char, char>(); //true
print_is_same<char, std::remove_const<const char>::type>(); //true
print_is_same<char, std::remove_const<std::remove_reference<const char &>::type>::type>(); //true
}
или, возможно, создать псевдоним типа, такой как
template<typename T>
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type;