Как проверить, совпадают ли два типа, игнорируя const и reference? - PullRequest
1 голос
/ 16 мая 2019

В 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
}

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Удаление квалификаторов 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;
0 голосов
/ 17 мая 2019

Я нашел альтернативное решение: вместо удаления 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
...