本质:对于不同数据,使用同一函数名实现相同操作。
-
函数重载:同一函数名,不同函数特征标(形参数量,形参类型)。
-
函数模板:同一函数名,相同形参数量,不同形参类型。非模板可以实现显式具体化的所有情况;显式具体化可以实现常规模板的所有情况。故优先级为 a > b > c。
i. 非模板:具体定义形参类型
void func(int a, intb)
ii. 显式具体化:强制使用指定形参类型template <> void <int> func(int a, int b)
iii. 常规模板/通用模板:任意形参类型template <typename T> func(T a, T b)
-
实例化:通过模板方式生成函数的过程
i. 显式实例化:强制选择模板方式生成
a. 直接使用通用模板:func<>(a, b)
b. 使用通用模板,并强制形参为某一类型:func<int>(a, b)
ii. 隐式实例化:根据排序规则来选择最合适的的函数