Correspondência de modelos não-variáveis variados

Digamos que eu tenho duas estruturas,Foo eBar:

template<int...>
struct Foo{};

template<unsigned long...>
struct Bar{};

Eu quero criar um traço de tipo (chame-omatch_class) que retorna true se eu passar doisFoo<...>&nbsp;tipos ou doisBar<...>&nbsp;tipos, mas false se eu tentar misturá-los:

int main()
{
    using f1 = Foo<1, 2, 3>;
    using f2 = Foo<1>;
    using b1 = Bar<1, 2, 3>;
    using b2 = Bar<1>;
    static_assert(match_class<f1, f2>::value, "Fail");
    static_assert(match_class<b1, b2>::value, "Fail");
    static_assert(!match_class<f1, b1>::value, "Fail");
}

Para C ++ 1z (clang 5.0.0 e gcc 8.0.0), é suficiente fazer isso (Demo):

template<class A, class B>
struct match_class : std::false_type{};

template<class T, template<T...> class S, T... U, T... V>
struct match_class<S<U...>, S<V...>> : std::true_type{};

Mas em C ++ 14 eu recebo o seguinte erro (mesmos compiladores* Demo):

error: class template partial specialization contains a template parameter that cannot be deduced; this partial specialization will never be used [-Wunusable-partial-specialization]
struct match_class<S<U...>, S<V...>> : std::true_type{};
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: non-deducible template parameter 'T'
template<class T, template<T...> class S, T... U, T... V>
Pergunta: O que é uma solução alternativa para isso no C ++ 14?

Idealmente, a sintaxe para testar o traço de tipo deve permanecer a mesma.

Pergunta secundária:O comportamento do C ++ 14 está correto? (ou, alternativamente, o comportamento que eu vejo no C ++ 17 não é especificado?)

* Observe que o MSVC 19.00.23506 tem o mesmo tipo de falhaDemo