对于课程,是的。对于函数,no 和 yes。
部分模板特化对于类来说很好,但对于全局函数来说就有点棘手了。
对于类,您只需从模板参数列表中省略专门的参数并将其包含在类定义中:
// General template class for a vector
template <class T, int N>
struct Vector
{
T e[N];
};
// Specialization for N=3
template <class T> // omit the N
struct Vector<T, 3> // and include it here
{
T e[3];
static Vector<T, 3> cross(const Vector<T, 3>& a, const Vector<T, 3>& b)
{
return Vector<T, 3>( a.e[1] * b.e[2] - a.e[2] * b.e[1],
a.e[2] * b.e[0] - a.e[0] * b.e[2],
a.e[0] * b.e[1] - a.e[1] * b.e[0] );
}
};
对于全局函数,您不能这样做。您可以定义一个完全通用的函数,也可以定义一个完全特化的函数——不允许对函数进行部分特化。
但是,您可以通过将函数创建为部分特化类的静态函数的代理来部分特化该函数。
例如
template <class A, class B>
void foo(A a, B b)
{
foo_impl::fun(a, b);
}
template <class A, class B>
struct foo_impl
{
static void fun(A a, B b)
{
// real implementation here
}
};
然后,您可以以任何您想要的方式进行专业化foo_impl
,这将反映在foo
.