在 C++ 中,函数模板与类模板之间存在哪些主要区别?请从定义方式、实例化时机、参数推导、特化以及使用场景等方面进行说明。
考察说明
考查对 C++ 模板体系中函数模板与类模板核心差异的理解。
回答思路
- 【回答框架 1】函数模板用于生成函数,定义时以 template 开头,参数类型可推导,调用时无需显式指定类型;类模板用于生成类,定义时同样以 template 开头,但实例化时必须显式指定模板参数,不能自动推导。
- 【回答框架 2】实例化时机不同:函数模板在调用时根据实参类型隐式实例化,类模板在创建对象时显式实例化,且类模板的成员函数只有在被使用时才会实例化。
- 【回答框架 3】特化方面:两者都支持全特化和偏特化,但函数模板不支持偏特化,只能通过重载实现类似效果;类模板支持偏特化,可以对部分参数进行特化。
- 【回答框架 4】使用场景上,函数模板适合通用算法如排序、查找,类模板适合容器、智能指针等需要封装状态和行为的类型。
- 【回答框架 5】模板参数既可以是类型参数,也可以是非类型参数,但函数模板的非类型参数通常用于数组大小等,类模板则更灵活。
- 【关键点 1】函数模板支持参数推导,类模板必须显式指定参数。
- 【关键点 2】函数模板不支持偏特化,类模板支持偏特化。
- 【关键点 3】类模板的成员函数按需实例化,函数模板在调用时实例化。
- 【关键点 4】两者都支持全特化,但函数模板通过重载实现类似偏特化效果。
- 【易错点 1】不要混淆函数模板的隐式实例化与类模板的显式实例化。
- 【易错点 2】函数模板偏特化不可用,需用重载替代。
- 【易错点 3】类模板的静态成员和嵌套类型在不同实例间不共享。