Нет ли требований, чтобы специализации принимали одинаковое количество параметров?
Есть;и удовлетворен в вашем примере.
Когда вы пишете
template<class T>
struct get_memfun_class;
, вы говорите, что get_mumfun_class
- это шаблон struct
с единственным шаблоном typename
аргумент;и когда вы пишете
template<class R, class T, class...Args>
struct get_memfun_class<R(T::*)(Args...)> {
using type=T;
};
, вы определяете специализацию, которая получает один аргумент typename шаблона в форме R(T::*)(Args...)
.
Из одного типа R(T::*)(Args...)
вы можете вывести болееодин шаблон параметров (R
, T
и variadic Args...
, в этом примере), но тип R(T::*)(Args...)
(метод класса, который получает список переменных variadic) остается один.
Например, что-то вроде этого законно?
template<typename T>
void foo(const T&);
template<typename K, typename V>
void foo<pair<K, V>>(const pair<K, V>&);
Нет, но (как написано в комментариях) вторая не является частичной специализацией класса / структуры (где * 1031)* остаются единым типом), это законно;это шаблон функция частичная специализация запрещена.
Но вы можете полный специализировать функцию шаблона;так что это законно (на примере)
template<>
void foo<std::pair<long, std::string>(const std::pair<long, std::string>&);
, как и законно полная специализация для get_memfun_class
(для примера)
template<>
struct get_memfun_class<std::pair<long, std::string>> {
using type=long long;
};