Благодарю. Я полагаю, что еще одна веская причина для перехода на C ++ 17 состоит в том, что вам не нужно беспокоиться о том, запомнили ли вы все их или нет.

тим, у меня есть две структуры,Foo а такжеBar:

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

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

Я хочу создать черту типа (назовите этоmatch_class), который возвращает истину, если я передам дваFoo<...> типы или дваBar<...> типы, но ложь, если я пытаюсь смешать их:

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");
}

Для C ++ 1z (clang 5.0.0 и gcc 8.0.0) этого достаточно (демонстрация):

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{};

Но в C ++ 14 я получаю следующую ошибку (те же компиляторы* демонстрация):

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>
Вопрос: Какой обходной путь для этого в C ++ 14?

В идеале синтаксис для проверки черты типа должен оставаться прежним.

Вторичный вопрос:Правильно ли поведение C ++ 14? (или альтернативно поведение, которое я вижу для C ++ 17, не определено?)

* Обратите внимание, что MSVC 19.00.23506 имеет такой же сбойдемонстрация

Ответы на вопрос(3)

Ваш ответ на вопрос