Общий шаблон возвращает false, а частичная специализация для двух одинаковых типов — true. Наследование от integral_constant также даёт поведение стандартного type trait.
Создание собственного type trait, аналогичного std::is_same
Общий шаблон возвращает false, а частичная специализация для двух одинаковых типов — true. Наследование от integral_constant также даёт поведение стандартного type trait.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте типовой шаблон, который определяет, являются ли два переданных типа одинаковыми, полностью повторяя поведение стандартного std::is_same. Класс должен предоставлять статическое булево значение value, равное true, если типы совпадают, и false в противном случае.
Ответ
Общий шаблон возвращает false, а частичная специализация для двух одинаковых типов — true. Наследование от integral_constant также даёт поведение стандартного type trait.
#include <type_traits>
template<class T, class U>
struct IsSame : std::false_type {};
template<class T>
struct IsSame<T, T> : std::true_type {};
static_assert(IsSame<int, int>::value);
static_assert(!IsSame<int, const int>::value);
static_assert(!IsSame<int, int&>::value);
Проверка не удаляет const, ссылки или другие квалификаторы. Алиасы одного типа считаются одинаковыми. Если нужно сравнение без ссылок и cv-квалификаторов, такое преобразование применяется отдельно и уже меняет исходный контракт is_same.