Ниже я попытался проверить, одинаковы ли два типа без создания экземпляров шаблона.
#include <cstddef>
template<class, class> struct twoTypes;
template<class T> std::size_t isSame(twoTypes<T,T>*);
bool isSame(void*);
template<class T, class U>
using checkIfSame = decltype(isSame(static_cast<twoTypes<T,U>*>(0)));
И чтобы проверить, совпадают ли они, размер checkIfSame будет сравниваться с размером std :: size_t:
static_assert(sizeof(checkIfSame<int,int>) == sizeof(std::size_t)); //They're the same
static_assert(sizeof(checkIfSame<const int,int>) == sizeof(bool)); //Not the same
Бывают ли случаи, когда мой код дает неправильный результат? Мои тесты показывают, что моя версия компилируется быстрее, чем std::is_same, но есть ли способы сделать это быстрее?
1 ответ
Если вы используете clang или GCC ≥10, вы можете использовать __is_same(type1, type2) внутренняя.
Для портативности:
#if !defined(__is_same) && (!defined(__clang__) || !defined(__GNUC__) || __GNUC__ < 10)
#define IS_SAME(T1, T2) std::is_same_v<T1, T2>
#else
#define IS_SAME(T1, T2) __is_same(T1, T2)
#endif

Я займусь внутренними функциями, хотя я задал свой вопрос в первую очередь, чтобы попросить оценить мой метод проверки того, являются ли два типа одинаковыми.
— Стив Чжан
Я думаю, что это выглядит нормально, но встроенные функции должны компилироваться еще быстрее.
— Рэй Хэмел