Не уверен, что понимаю, что ты хочешь, но ... я полагаю, вы хотите что-то как
template <typename, typename>
struct JustEqual : public std::false_type
{ };
template <typename T>
struct JustEqual<Just<T>, Just<T>> : public std::true_type
{ };
Таким образом, JustEqual
наследуется от std::true_type
, если (если и только если) оба типа названий являются Just<T>
типами для одного и того же T
.
Если имя типа имеет тип Just
для разных типов, или тип Just
и Nothing
, или два Nothing
, специализация JustEqual
не совпадает, а только основная версия (которая наследуется от std::false_type
).
Заметьте, что таким образом, JustEqual<Nothing, Nothing>
соответствует только основной версии, поэтому наследуйте от std::false_type
. Мне не ясно, если это то, что вы хотите.
Если вы хотите, чтобы JustEqual<Nothing, Nothing>
наследовали от std::true_type
, вы можете добавить определенную специализацию
template <>
struct JustEqual<Nothing, Nothing> : public std::true_type
{ };