Создание собственного type trait, аналогичного std::is_same

Общий шаблон возвращает false, а частичная специализация для двух одинаковых типов — true. Наследование от integral_constant также даёт поведение стандартного type trait.

Короткий ответ

Что ответить на собеседовании

Общий шаблон возвращает 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее