如何检查两个类型是否相同,忽略 const 和引用?

Ere*_*evi 9 c++ types type-traits

在 C++ 中,可以用来std::is_same检查两个类型是否完全相同。有没有办法检查两种类型是否相同,除了 aconst&修饰符?这是一个例子:

#include <type_traits>
#include <iostream>
using namespace std;

int main() {
    cout << boolalpha;
    cout << is_same<char,int>::value << endl;    // false - OK
    cout << is_same<char,char>::value << endl;   // true  - OK
    cout << is_same<char,const char>::value << endl;  // false - should be true
    cout << is_same<char,const char&>::value << endl; // false - should be true
}
Run Code Online (Sandbox Code Playgroud)

Tej*_*dra 8

从C++20std::remove_cvref将支持删除 cv 限定符以及返回非引用类型

但是,从当前标准开始,您可以结合使用类型修改函数

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
}
Run Code Online (Sandbox Code Playgroud)

或者可能创建一个类型别名,例如

template<typename T>
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
Run Code Online (Sandbox Code Playgroud)