ESP32 SD卡接口模式全解析:SPI、1-bit与4-bit性能对比与实战指南
2026/6/4 13:47:12
template<>开头,并在模板名后明确指定所有具体类型。template<...>中,并在类名后指定受限的类型模式(如MyClass<T*>)。由于函数模板不支持偏特化,通常使用重载来模拟偏特化的效果,或使用全特化处理确切类型。
#include <iostream> #include <string> // 1. 通用函数模板 (主模板) template <typename T> void print(T data) { std::cout << "Generic: " << data << std::endl; } // 2. 函数模板重载 (模拟偏特化效果,例如处理指针) // 注意:这不是特化,而是一个新的主模板 template <typename T> void print(T* ptr) { std::cout << "Pointer overload: " << *ptr << std::endl; } // 3. 函数模板全特化 (针对确切类型 string) // 语法:template<> 且指定具体类型 template <> void print<std::string>(std::string data) { std::cout << "Full Spec (string): " << data << std::endl; } int main() { int a = 10; std::string s = "Hello"; print(a); // 调用通用模板 print(&a); // 调用重载版本 (T* 匹配更优) print(s); // 调用全特化版本 (精确匹配) return 0; }注意:在函数模板中,如果同时存在重载和特化,重载决议优先于特化匹配。通常建议优先使用重载而非函数模板特化,以避免复杂的匹配规则陷阱。
类模板既支持全特化,也支持偏特化。
#include <iostream> // 1. 通用类模板 (主模板) template <typename T1, typename T2> class MyClass { public: MyClass() { std::cout << "Generic Class" << std::endl; } }; // 2. 类模板偏特化 (Partial Specialization) // 场景:当第一个参数是 int 时,无论第二个参数是什么 template <typename T2> class MyClass<int, T2> { public: MyClass() { std::cout << "Partial Spec: First param is int" << std::endl; } }; // 场景:当两个参数都是指针时 template <typename T1, typename T2> class MyClass<T1*, T2*> { public: MyClass() { std::cout << "Partial Spec: Both are pointers" << std::endl; } }; // 3. 类模板全特化 (Full Specialization) // 场景:当 T1=int 且 T2=double 时 template <> class MyClass<int, double> { public: MyClass() { std::cout << "Full Spec: int, double" << std::endl; } }; int main() { MyClass<char, float> obj1; // 输出: Generic Class MyClass<int, double> obj2; // 输出: Full Spec: int, double (全特化优先级最高) MyClass<int, char> obj3; // 输出: Partial Spec: First param is int MyClass<int*, char*> obj4; // 输出: Partial Spec: Both are pointers return 0; }当编译器寻找最佳的模板实例时,遵循以下优先级顺序(从高到低):