Большинство черт типов создаются с использованием частичной (или полной) специализации struct и template. Например, std::is_same
реализован как
template<typename>
struct is_same : false_type {};
template<typename T>
struct is_same<T, T> : true_type {}; // partial specialization
Использование будет
bool are_equal = std::is_same<T, U>::value;
или
.. = std::is_same_v<T, U>;
, что несколько уродливо. Сначала я думал, что это единственное решение, потом я обнаружил, что переменные также могут быть частично специализированными (а функции - нет). Черты преобразования типов не могут (явно) быть переменными, но для «информационных» черт, почему это не будет лучше, чем структура?
template<typename>
inline constexpr bool is_same = false;
template<typename T>
inline constexpr bool is_same<T, T> = true;
А затем
bool are_equal = std::is_same<T, U>;