C++ - специализировать шаблон функции на шаблонном классе с не типом параметра шаблона

У меня есть шаблон класса Foo:

template <class A, A value, class B>
class Foo {};

И у меня есть шаблон функции validateType()

template <class T>
bool validateType() {
    return false;
}

Теперь я хочу специализировать его для некоторых типов, включая Foo, чтобы функция выполняла некоторые static_asserts во время компиляции. Я попробовал это:

template <class A, class B, Foo<A, A val, B>>
bool validateType() {
    // do some static asserts
}

и это:

template <class A, A val, class B>
bool validateType<Foo<A, val, B>>() {
    // do some static asserts
}

В первом из них компилятор говорит:

error: wrong number of template arguments (2, should be 3)
 template <class A, class B, Foo<A, A val, B>>
                                            ^~
note: provided for ‘template<class A, A value, class B> class Foo’
 class Foo {};
       ^~~
error: two or more data types in declaration of ‘validateType’
 bool validateType() {
                   ^
error: expected ‘>’ before ‘{’ token
 bool validateType() {
                     ^

И во втором случае я получаю

error: non-class, non-variable partial specialization ‘validateType<Foo<A, val, B> >’ is not allowed
 bool validateType<Foo<A, val, B>>() {
                                   ^

Как это должно быть сделано?

1 ответ

Решение

Частичные специализации шаблонов не допускаются для шаблонов функций.
Используйте SFINAE или шаблоны классов

template <class T>
struct validateType : std::false_type {};

template <class A, A val, class B>
struct validateType<Foo<A, val, B>> : std::true_type {};
Другие вопросы по тегам