【发布时间】:2018-09-13 16:33:42
【问题描述】:
我刚刚问了这个问题:Can I get the Owning Object of a Member Function Template Parameter? 和Yakk - Adam Nevraumont 的答案有代码:
template<class T>
struct get_memfun_class;
template<class R, class T, class...Args>
struct get_memfun_class<R(T::*)(Args...)> {
using type=T;
};
这些显然是一个初始声明,然后是 struct get_memfun_class 的特化。但我发现自己不确定:专业化可以有不同数量的模板参数吗?
例如,这样的事情合法吗?
template<typename T>
void foo(const T&);
template<typename K, typename V>
void foo<pair<K, V>>(const pair<K, V>&);
是否没有要求特化必须采用相同数量的参数?
【问题讨论】:
-
"这些显然是...的 2 个专业化" 呃,只有一个专业化。
-
我不明白这个问题。不同数量的模板参数是什么意思?该示例的模板参数数量(
R、T和Args)与主参数(T)的数量不同。此外,foo示例也不合法,因为您不能部分专门化函数模板。 -
@Barry 第二个不是合法的,因为它是重载,而不是部分专业化?
-
@NathanOliver 作为重载是合法的,是的,但它被写成部分特化。
-
啊,是的,错过了那部分。
标签: c++ templates language-lawyer variadic-templates template-specialization