如何进行模板特化和偏特化?
函数模板特化:
当函数模板在特定类型下的实现需要特别处理时,可以使用函数模板特化。例如,对于比较字符串的大小,可以使用特化的Max函数:
template<typename T> T Max(T t1, T t2) { return (t1 > t2) ? t1 : t2; }
template<> const char* Max(const char* s1, const char* s2) { return strcmp(s1, s2) > 0 ? s1 : s2; }
这里,当T为const char*时,使用特化的Max函数来比较字符串。
类模板特化:
对于类模板,可以在特定类型下提供特定的实现。例如,对于类模板TC,当T和U都为int时,可以提供一个特化的版本:
template<typename T, typename U> void func(T a, U b) { /* 泛化版本 */ }
template<typename T> void func<int, T>(int a, T b) { /* 偏特化版本 */ }
这里,当第一个参数为int时,使用偏特化的func函数。
类模板偏特化:
对于类模板,当某些参数类型被指定为特定类型时,可以提供偏特化的实现。例如:
template<typename T, typename U> struct ClassA {};
template<typename T> struct ClassA<T, int> {};
这里,当第二个参数为int时,使用偏特化的ClassA。