c++ 忽略const和reference,如何检查两个类型是否相同?

xdnvmnnf  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(103)

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

#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
}
w41d8nur

w41d8nur1#

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
}

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

template<typename T>
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
ego6inou

ego6inou2#

我找到了另一个解决办法:我们可以添加const和&,而不是删除它们:

template<class T1, class T2>
bool is_almost_same_v = std::is_same_v<const T1&,const T2&>;

事实上:

cout << is_almost_same_v<char,int> << endl;    // false
cout << is_almost_same_v<char,char> << endl;   // true
cout << is_almost_same_v<char,const char> << endl;  // true
cout << is_almost_same_v<char,const char&> << endl; // true
p3rjfoxz

p3rjfoxz3#

在很多情况下,std::is_same_v<std::decay_t<TYPE_TO_TEST>, TYPE_TO_COMPARE>就可以了。std::decay_t<TYPE>还可以将数组类型转换为指向数组成员的指针,所以std::is_same_v<std::decay_t<int[5]>, int*>也会产生true。但是在很多情况下,这种行为甚至是有益的,特别是当你的测试需求是“可以像指针一样使用”时。

相关问题