Проверьте, совпадают ли два типа без экземпляров шаблонов

Ниже я попытался проверить, одинаковы ли два типа без создания экземпляров шаблона.

#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 ответ
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

  • Я займусь внутренними функциями, хотя я задал свой вопрос в первую очередь, чтобы попросить оценить мой метод проверки того, являются ли два типа одинаковыми.

    — Стив Чжан

  • Я думаю, что это выглядит нормально, но встроенные функции должны компилироваться еще быстрее.

    — Рэй Хэмел

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *