C++ 函数模板是一种允许程序员编写与数据类型无关的代码的机制。函数模板定义了一个操作,这个操作可以适用于多种数据类型,而无需为每种数据类型都重写该函数。当函数模板被调用时,编译器会根据传递给函数的参数类型生成相应的函数实例。
函数模板可以处理多种数据类型,包括但不限于基本数据类型(如int, double)、自定义类、结构体等。
下面是一个简单的函数模板示例,它返回其唯一参数,而不复制某些类型的参数(例如,通过引用传递):
#include <iostream>
#include <type_traits>
// 函数模板定义
template <typename T>
T& return_value(T& value) {
return value;
}
// 特化版本,用于处理右值引用
template <typename T>
T&& return_value(T&& value) {
return std::forward<T>(value);
}
int main() {
int a = 10;
int& ref_a = return_value(a); // 调用第一个模板实例
std::cout << ref_a << std::endl; // 输出 10
const int& cref_a = return_value(a); // 调用第一个模板实例
std::cout << cref_a << std::endl; // 输出 10
int b = return_value(20); // 调用第二个模板实例,完美转发
std::cout<< b << std::endl; // 输出 20
return 0;
}
当模板函数返回一个局部对象的副本时,会发生不必要的复制。这是因为编译器默认会生成一个返回值类型的副本构造函数调用。
std::move
:在适当的情况下,可以使用std::move
来将对象转换为右值引用,从而触发移动构造函数。class MyClass {
public:
MyClass() { /* ... */ }
MyClass(MyClass&& other) noexcept { /* 移动构造函数实现 */ }
MyClass& operator=(MyClass&& other) noexcept { /* 移动赋值运算符实现 */ }
// ...
};
MyClass create_object() {
MyClass obj;
// ...
return std::move(obj); // 触发移动构造函数
}
通过上述方法,可以有效避免不必要的复制,提高程序性能。
领取专属 10元无门槛券
手把手带您无忧上云