函数模板是采用模板参数,而这些参数在函数调用时会根据传入的实参类型进行推导或者显式指定。
函数模板示例
下面是一个简单的函数模板示例:
template<typename T>
void print(const T& value) {
std::cout << value << std::endl;
}
这个模板函数可以接受任何类型的参数,因为参数类型`T`是在调用函数时确定的。
使用函数模板
你可以这样使用这个函数模板:
int main() {
print(42); // 输出整数
print(3.14); // 输出浮点数
print("Hello"); // 输出字符串字面量
return 0;
}
在上述例子中,编译器会自动推导出模板参数`T`的类型:
- 当传入`42`时,`T`被推导为`int`。
- 当传入`3.14`时,`T`被推导为`double`。
- 当传入`"Hello"`时,`T`被推导为`const char*`。
显式指定模板参数
你也可以显式地指定模板参数:
int main() { print<int>(42); // 显式指定T为int print<double>(3.14); // 显式指定T为double print<const char*>("Hello"); // 显式指定T为const char* return 0; }
带多个模板参数的函数模板
函数模板也可以带多个模板参数:
template<typename T1, typename T2>
void printPair(const T1& first, const T2& second) {
std::cout << first << ", " << second << std::endl;
}
使用这个函数模板:
int main() {
printPair(42, 3.14); // T1被推导为int, T2被推导为double
printPair("Hello", 100); // T1被推导为const char*, T2被推导为int
return 0;
}
总结
类模板:模板参数在实例化类时指定,并且可以在整个类的范围内使用。
函数模板:模板参数在调用函数时由编译器推导或者显式指定。
这两种模板机制使得C++具有高度的泛型编程能力,允许编写类型安全且复用性强的代码。